如果下一个元素存在于迭代器上,那么std :: iterator可以检查吗?

hus*_*snu -2 c++ iterator stl

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

有这样的控制;

vector<int> v; 
vector<int>::iterator itr;
if(itr== v.end()) { /*...*/}
Run Code Online (Sandbox Code Playgroud)

但是我想在我的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?
  }
Run Code Online (Sandbox Code Playgroud)

Nic*_*las 5

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

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

你要做的是结合两个不同的想法:位置和范围.一些迭代模型以这种方式做事,但这不是C++标准库所基于的STL派生模型.

现在公平地说,在某些情况下,位置固有地包含范围信息.stream基于迭代器的迭代器知道它们是否在流的末尾,因为它们作为迭代器起作用,它们必须存储对它们迭代的流的引用.并且流知道它是否没有数据.但总的来说,单个迭代器并不意味着知道它是否在其范围的末尾.