Может ли std :: iterator проверить, существует ли следующий элемент поверх этого итератора? - PullRequest
0 голосов
/ 28 декабря 2018

У меня есть шаблонный класс Iterator, содержащий std :: iterator контейнера, который указан шаблоном.Я не нашел способа проверить, существует ли следующий элемент в итераторе, без использования контейнера.

Существует такой элемент управления;

vector<int> v; 
vector<int>::iterator itr;
if(itr== v.end()) { /*...*/}

но я хотел сделать этот элемент управления в своем классе Iterator, и мой класс подобен следующему ...

  template <class E, class C= vector<E> >
  class Iterator {
  public:
    /*...*/
    bool hasNext()noexcept; 
    /*...*/
  private:
    typename C::iterator itr; // is there any problem with this decleration?
  };

  //implementation of hasNext() function.
  template<class E, class C>
  bool
  Iterator<E,C>::hasNext()noexcept {
    return(itr!=end())?true:false; // this line is wrong. How can I fix it?
  }

1 Ответ

0 голосов
/ 28 декабря 2018

Итератор представляет позицию в последовательности элементов.Итератор знает, как перейти к следующему элементу в этой последовательности, но природа модели итератора в C ++ основана на идее, что после конца такой последовательности существует итератор «за концом конца».Такой итератор не представляет допустимый элемент в последовательности;это просто представляет конец последовательности, и итераторы могут быть проверены против него.

Эта конструкция полезна, поскольку она позволяет вам говорить о поддиапазонах элементов в последовательности.Например, если контейнер содержит 10 элементов, вы можете передать итераторы begin/end алгоритму std::sort, чтобы отсортировать их.Однако вы также можете отсортировать первые 10 элементов, передав итератор begin и итератор begin() + 10 в одну и ту же функцию.Алгоритм sort будет трактовать данный конечный итератор как итератор «за конец», а не как итератор действительного элемента.

То, что вы пытаетесь сделать, - это объединить две разные идеи: положение испектр.Некоторые итерационные модели работают таким образом, но это не модель, основанная на STL, на которой основана стандартная библиотека C ++.

Теперь, чтобы быть справедливым, в некоторых случаях позиция по своей природе несет информацию о диапазоне.Итераторы на основе stream знают, находятся ли они в конце потока или нет, потому что для функционирования в качестве итератора они должны хранить ссылку на поток, по которому они перебираются.И поток знает, нет ли у него данных.Но в целом, один итератор не предназначен для того, чтобы знать, находится ли он в конце своего диапазона или нет.

...