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&lt;E,C&gt;::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&lt;class E, class C&gt; Iterator&lt;E, C&gt;::Iterator(C c) 和属性 C container; : 你在 C 的副本上工作

所以你必须将它们更改为template&lt;class E, class C&gt; Iterator&lt;E, C&gt;::Iterator(C &amp; c) 属性C &amp; container;

你来自Java你必须小心,在Java中一个对象是由地址给出的,在C++中没有修饰符'&'一个对象是由值给出的(复制)

【讨论】:

声明 C&amp; container(并使用 Iterator(C c) : container(c) 初始化)可能会有所帮助 谢谢你们,为了表明这一点,我拿着一个指向初始容器的指针,它已经解决了。 (C * 容器;) @AdrianW -- 那应该是Iterator(C&amp; c) AdrianW,你是对的,我也用这个改变了构造函数:Iterator(C&c); @bruno,再次感谢您记住这个想法,但是如果您根据 AdrianW 的评论和我的评论更改您的答案,那将对其他人有所帮助。 @hsn 我明确添加了新签名,但对我来说,这在我之前的版本中是隐含的

以上是关于if (itr != container.end() ) 未能捕获和元素的主要内容,如果未能解决你的问题,请参考以下文章

STL进阶--删除元素

哪个更好 std::prev(itr) 或 --itr?

ICRSGCRSCIRSTIRS和ITRS坐标系统简介

反射式红外光电检测管 : ITR9909

反射式红外光电管 ITR8307

ArrayList$Itr.next 抛出错误 concurrentModificationException