我想知道在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;
来防止错误。但似乎我无法比较像这样的迭代器。
答案 0 :(得分:4)
你应该阅读Introduction to the STL,它解释了迭代器概念的各种改进。
只有RandomAccessIterators支持与<
的比较,因为它对非RandomAccessIterator来说不是一种有效的操作。
判断BidirectionalIterator i
是否小于另一个j
的唯一方法是逐步增加i
一步并查看是否曾经达到j
,但如果j
无法从i
访问,则永远不会发生,如果i
不可递增,则会出错,例如因为它是该范围的过去的迭代器。
或者,您可以递减i
并查看是否达到j
,在这种情况下,您知道j
小于i
,但这不起作用如果i
是开始迭代器,因为你不能在范围的开头之前迭代。
所以一般来说,无法知道一个非RandomAccessIterator是在它之前还是之后,因为你甚至不知道是开始向前还是向后迭代到达另一个,你不知道它何时到来可以安全地继续前进或者到达有效范围的末尾。
所以按照惯例,你总是按照相同的顺序传递迭代器,这样首先是开始迭代器,而过去的迭代器是第二个,并且可以通过递增开始来到达过去的迭代器迭代器零次或多次。
然后:
Sum(my_list.begin(),my_list.end());
没问题,但Sum(my_list.end(),my_list.begin());
会导致运行时错误。
不要那样做!
调用者有责任正确调用函数,为什么调用者不知道哪个迭代器是开始,哪个是结束?
答案 1 :(得分:-2)
当你调用Sum(my_list.begin(),my_list.end())时, my_list.begin()将指向列表中的第一个元素
double Sum(std::list::const_iterator& Start, std::list::const_iterator& End)
{
double sum=0;
if (Start;Start!=End;Start++)
sum+=*Start;
return sum;
}
SameWay当你调用 Sum(my_list.end(),my_list.begin())时,my_list.end()将指向列表中的最后一个元素。
进行以下更改将起作用,
double Sum(std::list<int>::const_iterator Start, std::list<int>::const_iterator End)
{
double sum=0;
for (Start;Start!=End;Start)
sum+=*(--Start);
return sum;
}