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

时间:2015-06-29 17:33:02

标签: c++ stl listiterator

我想知道在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;来防止错误。但似乎我无法比较像这样的迭代器。

2 个答案:

答案 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;
}