是同一个集合中的两个不同的迭代器相等

时间:2012-10-29 16:23:19

标签: c++ stl iterator

假设我使用嵌套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?
      }
    }
  }

2 个答案:

答案 0 :(得分:5)

  

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

是的,这意味着您的期望,并且工作正常。

答案 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。但这可能不适用于其他迭代器。