if (itr != container.end() ) 未能捕获和元素
Posted
技术标签:
【中文标题】if (itr != container.end() ) 未能捕获和元素【英文标题】:if (itr != container.end() ) fail to catcht end element 【发布时间】: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) 构造函数中传入的容器的开头,但检查作为成员变量的复制容器的结束迭代器。这是一个禁忌。
【参考方案1】:
template<class E, class C> Iterator<E, C>::Iterator(C c)
和属性
C container;
: 你在 C 的副本上工作
所以你必须将它们更改为template<class E, class C> Iterator<E, C>::Iterator(C & c)
属性C & container;
你来自Java你必须小心,在Java中一个对象是由地址给出的,在C++中没有修饰符'&'一个对象是由值给出的(复制)
【讨论】:
声明C& container
(并使用 Iterator(C c) : container(c)
初始化)可能会有所帮助
谢谢你们,为了表明这一点,我拿着一个指向初始容器的指针,它已经解决了。 (C * 容器;)
@AdrianW -- 那应该是Iterator(C& c)
。
AdrianW,你是对的,我也用这个改变了构造函数:Iterator(C&c); @bruno,再次感谢您记住这个想法,但是如果您根据 AdrianW 的评论和我的评论更改您的答案,那将对其他人有所帮助。
@hsn 我明确添加了新签名,但对我来说,这在我之前的版本中是隐含的以上是关于if (itr != container.end() ) 未能捕获和元素的主要内容,如果未能解决你的问题,请参考以下文章