Программирование. Принципы и практика использования C++ Исправленное издание, стр. 275
iterator end( ); // итератор, ссылающийся на последний элемент iterator insert(iterator p, const Elem& v); // вставка v // в список после элемента, // на который установлен итератор p iterator erase(iterator p); // удаление из списка элемента, // на который установлен итератор p void push_back(const Elem& v); // вставка v в конец списка void push_front(const Elem& v); // вставка v в начало списка void pop_front(); // удаление первого элемента void pop_back(); // удаление последнего элемента Elem& front(); // первый элемент Elem& back(); // последний элемент // ...}Так же как наш класс
vectorlistlistИтератор играет главную роль в определении класса
list
listlst[1000]1000advance()listМы сделали тип итератора для списка членом класса (вложенным классом), потому что нет никаких причин делать его глобальным. Он используется только в списках. Кроме того, это позволяет нам называть каждый тип в контейнере именем
iteratorlist<T>::iteratorvector<T>::iteratormap<K,V>::iterator20.4.2. Итерация
Итератор списка должен обеспечивать выполнение операций
*++==!=template<class Elem> class list<Elem>::iterator { Link<Elem>* curr; // текущий узелpublic: iterator(Link* p):curr(p) { } // вперед iterator& operator++() {curr = curr–>succ; return *this; } // назад iterator& operator––() { curr = curr–>prev; return *this; } // (разыменовать) Elem& operator*() { return curr–>val; } // получить значение bool operator==(const iterator& b) const { return curr==b.curr; } bool operator!= (const iterator& b) const { return curr!=b.curr; }};Эти функции короткие, простые и эффективные: в них нет циклов, нет сложных выражений и подозрительных вызовов функций. Если эта реализация вам не понятна, то посмотрите на диаграммы, приведенные ранее. Этот итератор списка просто представляет собой указатель на узел с требуемыми операциями. Несмотря на то что реализация (код) для класса
list<Elem>::iterator++––*==!=Посмотрим на функцию
high()template<class Iterator >Iterator high(Iterator first, Iterator last)// возвращает итератор на максимальный элемент в диапазоне// [first,last){ Iterator high = first; for (Iterator p = first; p!=last; ++p) if (*high<*p) high = p; return high;}Мы можем применить ее к объекту класса
listvoid f()