如果(itr!= container.end())未能捕获到结束元素

时间:2018-12-29 12:20:49

标签: c++ templates stl iterator

我有一个Iterator类,并且我想在没有容器信息的情况下实现该类中的控件(这很奇怪,我知道但是我是在做家庭作业)。因此,我找到了一个技巧,可以将容器保留为成员变量。

这是我的标题模板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;
  };

这里是我的Iterator构造函数,用于初始化成员变量。

  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);
    }
  }

1 个答案:

答案 0 :(得分: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)的{​​{1}}

我来自Java,您必须保重,在Java中,对象是由地址给定的;在C ++中,没有修饰符'&',则对象是由值(复制的)给定的