【发布时间】:2018-12-29 12:20:49
【问题描述】:
我有一个 Iterator 类,我想在没有容器信息的情况下在该类中实现控件(我知道这很奇怪,但我正在做作业)。所以我找到了一个技巧,将容器保持为成员变量。
这是我的头模板迭代器类
template <class E, class C= vector<E> >
class Iterator {
public:
Iterator(C c);
Iterator();
bool hasNext()noexcept;
typename C::iterator& next()noexcept;
void remove()noexcept;
E& operator *()throw(domain_error);
private:
typename C::iterator itr;
C container;
};
这里是我初始化成员变量的迭代器构造函数。
template<class E, class C>
Iterator<E, C>::Iterator(C c) {
container =c;
itr= c.begin();
}
这是我的问题函数Iterator<E,C>::hasNext
template<class E, class C>
bool
Iterator<E,C>::hasNext()noexcept {
return (itr != container.end()); //can not catch end element
}
由于Iterator::hasNext 函数未能捕获端点,hashSet::addAll 函数中出现无限循环。 (这是另一个使用 Iterator 类作为辅助类的类)
template<class E, class C>
void
HashSet<E, C>::addAll(C &c)noexcept {
Iterator<E,C> itr = Iterator<E,C>(c);
while(itr.hasNext()){
add(*itr);
itr.next();
}
}
hashSet::add(E e) 函数
template<class E, class C> void HashSet<E, C>::add(E e)noexcept { if(contains(e)!=true){ // cerr<<"hashSet::add "<< e <<endl; container.insert(container.end(),e); } }
【问题讨论】:
-
什么是
add()?它是否会使您尝试使用的迭代器无效? (这看起来像您正在尝试用 c++ 编写 Java 代码......这不是一个好主意。) -
结束的定义是什么? != 运算符?请提供minimal reproducible example。
-
Shawn, 作业的定义是在后面使用STL开发一个类似于Java结构化集合库的库。我还在末尾添加了 add() 函数,并试图更清楚地了解“end”
-
您将 itr 初始化为 (c) 构造函数中传入的容器的开头,但检查作为成员变量的复制容器的结束迭代器。这是一个禁忌。
标签: c++ templates stl iterator