12.4.2. Обратные итераторы

12.4.2. Обратные итераторы

Операции begin() и end() возвращают соответственно итераторы, указывающие на первый элемент и на элемент, расположенный за последним. Можно также вернуть обратный итератор, обходящий контейнер от последнего элемента к первому. Во всех контейнерах для поддержки такой возможности используются операции rbegin() и rend(). Есть константные и неконстантные версии обратных итераторов:

vector int vec0;

const vector int vec1;

vector int ::reverse_iterator r_iter0 = vec0.rbegin();

vector int ::const_reverse_iterator r_iter1 = vec1.rbegin();

Обратный итератор применяется так же, как прямой. Разница состоит в реализации операторов перехода к следующему и предыдущему элементам. Для прямого итератора оператор ++ дает доступ к следующему элементу контейнера, тогда как для обратного – к предыдущему. Например, для обхода вектора в обратном направлении следует написать:

// обратный итератор обходит вектор от конца к началу

vector type ::reverse_iterator r_iter;

for ( r_iter = vec0.rbegin(); // r_iter указывает на последний элемент

r_iter != vec0.rend(); // пока не достигли элемента перед первым

r_iter++ ) // переходим к предыдущему элементу

{ /* ... */ }

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

// сортирует вектор в порядке возрастания

sort( vec0.begin(), vec0.end() );

// сортирует вектор в порядке убывания

sort() пару обратных итераторов:

sort( vec0.rbegin(), vec0.rend() );

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Итераторы

Из книги Руководство по стандартной библиотеке шаблонов (STL) автора Ли Менг

Итераторы Итераторы - это обобщение указателей, которые позволяют программисту работать с различными структурами данных (контейнерами) единообразным способом. Чтобы создать шаблонные алгоритмы, которые правильно и эффективно работают с различными типами структур


ИТЕРАТОРЫ ПОТОКОВ

Из книги Руководство администратора баз данных Informix. автора Кустов Виктор

ИТЕРАТОРЫ ПОТОКОВ Чтобы шаблоны алгоритмов могли работать непосредственно с потоками ввода-вывода, предусмотрены соответствующие шаблонные классы, подобные итераторам. Например,partial_sum_copy(istream_iterator‹double›(cin), istream_iterator‹double›(), ostream_iterator‹double›(cout, " "));читает файл,


Обратные итераторы (Reverse iterators)

Из книги Эффективное использование STL автора Мейерс Скотт

Обратные итераторы (Reverse iterators) Двунаправленные итераторы и итераторы произвольного доступа имеют соответствующие адаптеры обратных итераторов, которые выполняют итерации через структуру данных в противоположном направлении.Они имеют те же самые сигнатуры, как и


Итераторы вставки (Insert iterators)

Из книги Идиомы и стили С++ автора Makhmutov Albert

Итераторы вставки (Insert iterators) Чтобы было возможно иметь дело с вставкой таким же образом, как с записью в массив, в библиотеке обеспечивается специальный вид адаптеров итераторов, называемых итераторами вставки (insert iterators). С обычными классами итераторовwhile (first!= last) *result++ =


2.2.5.2 Итераторы

Из книги Основы объектно-ориентированного программирования автора Мейер Бертран

2.2.5.2 Итераторы Итератор - это программный объект, который осуществляет итеративную (циклическую) обработку некоторого множества данных. Итераторы различаются типом производимой обработки, но имеют единообразный внешний интерфейс. Каждый итератор открывает один (или


Итераторы

Из книги TCP/IP Архитектура, протоколы, реализация (включая IP версии 6 и IP Security) автора Фейт Сидни М

Итераторы На первый взгляд итераторы представляются предметом весьма простым. Но стоит присмотреться повнимательнее, и вы заметите, что стандартные контейнеры STL поддерживают четыре разных типа итераторов: iterator, const_iterator, reverse_iterator и const_reverse_iterator. Проходит совсем немного


Итераторы.

Из книги Программирование на языке Ruby [Идеология языка, теория и практика применения] автора Фултон Хэл

Итераторы. В Шагах 15 и 16 мы повозились с имитацией массива (коллекцией). Мы добились нормальной работы при чтении и записи в ячейки массива. Но работа с массивом этим не ограничивается. Вот захочется нам сделать что-то со всеми элементами массива, а он индексирован по


У15.4 Итераторы фигур

Из книги Linux и UNIX: программирование в shell. Руководство разработчика. автора Тейнсли Дэвид

У15.4 Итераторы фигур При обсуждении COMPOSITE_FIGURE мы говорили о применении итераторов для выполнения операций над составными фигурами. Разработайте соответтсвующие классы итераторов. (Подсказка: в [M 1994a] приведены классы библиотеки итераторов, которые послужат основой вашей


5.24.3 Обратные запросы ARP

Из книги C++ для начинающих автора Липпман Стенли

5.24.3 Обратные запросы ARP Один из вариантов ARP называется обратным запросом (reverse ARP — RARP) и служит для определения узлом собственного IP-адреса. Такие запросы предназначены для бездисковых рабочих станций и других устройств, которые получают конфигурационную информацию от


6.2.6. Обратные диапазоны

Из книги автора

6.2.6. Обратные диапазоны Имеет ли смысл говорить об обратном диапазоне? И да, и нет. Следующий диапазон допустим:r = 6..3x = r.begin # 6y = r.end   # 3flag = r.end_excluded? # falseКак видите, мы можем определить обе границы и узнать, что правая граница включена. Но этим перечень возможных операций


15.4. Обратные кавычки

Из книги автора

15.4. Обратные кавычки Обратные кавычки позволяют присваивать переменным данные вывода системных команд. Символы, заключенные в обратные кавычки, воспринимаются интерпретатором shell как системная команда, которую следует выполнить. С помощью этого метода можно


12.4.1. Итераторы вставки

Из книги автора

12.4.1. Итераторы вставки Вот еще один фрагмент программы, в котором есть тонкая, но серьезная ошибка.int ia[] = { 0, 1, 1, 2, 3, 5, 5, 8 };vector int ivec( ia, ia+8 ), vres;// ...// поведение программы во время выполнения не определеноВидите ли вы, в чем она заключается?unique_copy( ivec.begin(), ivec.end(), vres.begin() );Проблема


12.4.3. Потоковые итераторы

Из книги автора

12.4.3. Потоковые итераторы Стандартная библиотека предоставляет средства для работы потоковых итераторов чтения и записи совместно со стандартными контейнерами и обобщенными алгоритмами. Класс istream_iterator поддерживает итераторные операции с классом istream или одним из