std :: iterator是否可以检查该迭代器上是否存在下一个元素?

时间:2018-12-28 18:06:42

标签: c++ stl iterator

我有一个模板迭代器类,其中包含由模板指定的容器的std :: iterator。我没有找到任何方法来检查迭代器中是否存在下一个元素,而无需使用容器。

有一个这样的控件;

vector<int> v; 
vector<int>::iterator itr;
if(itr== v.end()) { /*...*/}

但是我想在Iterator类中进行此控制,而我的类就像下面的内容...

  template <class E, class C= vector<E> >
  class Iterator {
  public:
    /*...*/
    bool hasNext()noexcept; 
    /*...*/
  private:
    typename C::iterator itr; // is there any problem with this decleration?
  };

  //implementation of hasNext() function.
  template<class E, class C>
  bool
  Iterator<E,C>::hasNext()noexcept {
    return(itr!=end())?true:false; // this line is wrong. How can I fix it?
  }

1 个答案:

答案 0 :(得分:5)

迭代器表示项目序列中的位置。迭代器知道如何到达该序列中的下一个元素,但是C ++迭代器模型的本质是基于这样的想法,即在该序列结束之后存在“过去式”迭代器。这样的迭代器不能代表序列中的有效项;它仅表示序列的结尾,可以针对它测试迭代器。

此构造很有用,因为它允许您讨论序列中元素的子范围。例如,如果一个容器有10个元素,则可以将begin/end迭代器传递给std::sort算法以对其进行排序。但是,您也可以通过将begin迭代器和begin() + 10迭代器传递给同一函数来对前10个元素进行排序。 sort算法会将给定的结束迭代器视为“过去”迭代器,而不是有效元素的迭代器。

您想要做的是结合两个不同的想法:位置和范围。一些迭代模型可以这样做,但是那不是C ++标准库所基于的STL衍生模型。

坦白地说,在某些情况下,头寸固有地带有范围信息。基于stream的迭代器知道它们是否在流的末尾,因为要充当迭代器,它们必须存储对其迭代的流的引用。流知道它是否没有数据。但是总的来说,单个迭代器并不意味着知道它是否在其范围的末端。