我有一个模板迭代器类,其中包含由模板指定的容器的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?
}
答案 0 :(得分:5)
迭代器表示项目序列中的位置。迭代器知道如何到达该序列中的下一个元素,但是C ++迭代器模型的本质是基于这样的想法,即在该序列结束之后存在“过去式”迭代器。这样的迭代器不能代表序列中的有效项;它仅表示序列的结尾,可以针对它测试迭代器。
此构造很有用,因为它允许您讨论序列中元素的子范围。例如,如果一个容器有10个元素,则可以将begin/end
迭代器传递给std::sort
算法以对其进行排序。但是,您也可以通过将begin
迭代器和begin() + 10
迭代器传递给同一函数来对前10个元素进行排序。 sort
算法会将给定的结束迭代器视为“过去”迭代器,而不是有效元素的迭代器。
您想要做的是结合两个不同的想法:位置和范围。一些迭代模型可以这样做,但是那不是C ++标准库所基于的STL衍生模型。
坦白地说,在某些情况下,头寸固有地带有范围信息。基于stream
的迭代器知道它们是否在流的末尾,因为要充当迭代器,它们必须存储对其迭代的流的引用。流知道它是否没有数据。但是总的来说,单个迭代器并不意味着知道它是否在其范围的末端。