gpt4 book ai didi

c++ - 如何比较两个双向迭代器的(顺序)?

转载 作者:行者123 更新时间:2023-11-30 03:51:43 29 4
gpt4 key购买 nike

我想知道 C++ 中是否有内置方法来比较两个双向迭代器的顺序。例如,我有一个 Sum 函数来计算同一列表中 2 个迭代器之间的总和:

double Sum(std::list::const_iterator Start, std::list::const_iterator End){
double sum=0;
for (Start;Start!=End;Start++)
sum+=*Start;
return sum;
}

然后:Sum(my_list.begin(),my_list.end()); 没问题,但是 Sum(my_list.end(),my_list.begin()); 会导致运行时错误。

我在考虑放置if (Start>End) return 0; 来防止错误。但我似乎无法像这样比较迭代器。

最佳答案

你应该阅读 Introduction to the STL其中解释了迭代器概念的各种改进。

只有 RandomAccessIterators支持与 < 比较因为它对于非 RandomAccessIterators 不是一个有效的操作。

判断 BidirectionalIterator 是否存在的唯一方法i小于另一个,j , 是通过递增 i一次一步,看看你是否到达了j , 但如果 j 就永远不会发生无法从 i 访问, 如果 i 则为错误不可递增,例如因为它是范围的尾后迭代器。

或者,您可以递减 i看看你是否到达j ,在这种情况下你知道 j小于 i , 但如果 i 则行不通是开始迭代器,因为您不能在范围开始之前进行迭代。

所以一般来说没有办法知道一个非 RandomAccessIterator 是在另一个之前还是之后,因为你甚至不知道是开始向前迭代还是向后迭代到达另一个,你也不知道什么时候它可以安全地继续前进或到达有效范围的尽头。

所以按照惯例,你总是以相同的顺序传递迭代器,这样开始迭代器首先出现,结束迭代器排在第二位,并且可以通过递增开始到达结束迭代器迭代器零次或多次。

Then: Sum(my_list.begin(),my_list.end()); is fine, but Sum(my_list.end(),my_list.begin()); will cause runtime error.

那就不要那样做!

正确调用函数是调用者的责任,为什么调用者不知道哪个迭代器是开始哪个是结束?

关于c++ - 如何比较两个双向迭代器的(顺序)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31121972/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com