【问题标题】:are two different iterators on the same collection equal同一个集合上的两个不同的迭代器是否相等
【发布时间】:2012-10-29 16:23:18
【问题描述】:

假设我使用嵌套的 for 来比较同一列表中的对象:

for( list<Object>::iterator iter = list.begin() ; iter != list.end() ; ++iter )
  {
    for( list<Object>::iterator iter2 = list.begin() ; iter2 != list.end() ; ++iter2 )
    {
      if( iter == iter2 )
      {
        // does this mean iter is pointing to the same INDEX
        // as iter2?  Will this work as expected?
      }
    }
  }

【问题讨论】:

  • 如果没有,iter != list.end() 怎么能工作?
  • 我是这么想的,但我还是决定问一下。

标签: c++ stl iterator


【解决方案1】:

...比较同一列表中的对象:

是的,这正是您所期望的,并且工作正常。

【讨论】:

  • 可以选择任何一种方式:有那么一刻我以为我弄错了
【解决方案2】:

简短回答:

中等答案:

std:: 中的普通容器提供了可以直接比较的迭代器。但是你不能对其他容器类型做出这样的一般假设。

长答案:

这完全取决于容器的类型,以及该容器返回的迭代器的类型。如果您在谈论标准(std::) 中的容器,那么是的。但不要假设这适用于所有类型的迭代器。请记住,在 C++ 中,传递迭代器而不是对容器的引用更为常见。

template<typename I>
I doStuff(I begin, I end)
{
      typedef tyepename std::interator_traits<I>::iterator_category   iterator_category;

      I   alternative = begin;

      assert(alternative == begin);   // Will always be true

      ++begin;
      ++alternative;

      assert(alternative == begin);  // Will depend on the type of iterator.
      return end;
}

// Alternative using container
template<typename C>
void doStuff(C& cont)
{
      typedef tyepename std::interator_traits<typename C::iterator>::iterator_category   iterator_category;

      I   begin       = cont.begin();
      I   alternative = cont.begin();

      assert(alternative == begin);   // Will always be true

      ++begin;
      ++alternative;

      assert(alternative == begin);  // Will depend on the type of iterator.
}

Inputoutput 迭代器不能像那样直接比较。

但是Bi-DirectionalRandom Access 迭代器直接可比的。

见:http://www.sgi.com/tech/stl/iterator_category.html

注意:end() 返回的迭代器总是可以直接比较的,并且在容器末尾之后返回 true。但这可能不适用于其他迭代器。

【讨论】:

    猜你喜欢
    • 2012-11-28
    • 2021-06-27
    • 2023-01-12
    • 2015-06-02
    • 2013-07-03
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    相关资源
    最近更新 更多