if (itr! = container.end ()) не может перехватить конечный элемент - PullRequest
0 голосов
/ 29 декабря 2018

У меня есть класс 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) function

 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 голосов
/ 29 декабря 2018

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 ++ без модификатора '&' объект задается по значению (копируется)

...