1

I was wondering if there is a build-in way in C++ to compare the order of two bidirectional iterators. For example, I have a Sum function to calculate the sum between 2 iterators in the same list:

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

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

I was thinking puttingif (Start>End) return 0; to prevent the error. But it seems I cannot compare the iterators like this.

4

2 回答 2

4

您应该阅读STL 简介,其中解释了迭代器概念的各种改进。

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

判断一个BidirectionalIterator i是否小于另一个的唯一方法j是,一次递增一个步骤,i看看你是否曾经到达j过例如,因为它是范围的结束迭代器。jii

或者,您可以递减i并查看是否达到j,在这种情况下,您知道j小于i,但是如果是开始迭代器,那将不起作用i,因为您无法在范围开始之前进行迭代。

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

因此,按照惯例,您总是以相同的顺序传递迭代器,因此开始迭代器首先出现,结束迭代器排在第二位,并且可以通过将开始迭代器递增 0 或更多次。

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

那就不要那样做!

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

于 2015-06-29T17:54:58.530 回答
-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;
}
于 2015-06-29T18:14:00.160 回答