РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
341 of 815 menu

Класс reverse_iterator

Класс reverse_iterator представляет собой адаптер итератора, который позволяет проходить контейнер в обратном направлении - от последнего элемента к первому. Он принимает в качестве параметра обычный итератор и инвертирует его поведение: операция ++ перемещает итератор к началу контейнера, а операция -- - к концу. При разыменовании reverse_iterator возвращает элемент, предшествующий текущему положению базового итератора.

Класс объявлен в заголовочном файле <iterator>. Объекты reverse_iterator обычно получают с помощью методов rbegin и rend, которые возвращают обратные итераторы на последний и первый элементы контейнера соответственно.

Синтаксис

std::reverse_iterator<Iterator> it(base_iterator);

Где Iterator - тип базового итератора, а base_iterator - исходный итератор, который будет адаптирован для обратного прохода.

Пример

Давайте создадим вектор и пройдём его в обратном направлении с помощью reverse_iterator, полученного методом rbegin:

#include <iostream> #include <vector> #include <iterator> using namespace std; int main() { vector<int> vec = {1, 2, 3, 4, 5}; for (reverse_iterator<vector<int>::iterator> it = vec.rbegin(); it != vec.rend(); ++it) { cout << *it << " "; } cout << endl; return 0; }

Результат выполнения кода:

5 4 3 2 1

Пример

Давайте создадим reverse_iterator напрямую из обычного итератора, указывающего на элемент 'c' в строке:

#include <iostream> #include <string> #include <iterator> using namespace std; int main() { string str = "abcde"; string::iterator base = str.begin() + 2; reverse_iterator<string::iterator> rit(base); cout << *rit << endl; return 0; }

Результат выполнения кода:

"b"

Обратите внимание: reverse_iterator разыменовывается в элемент, предшествующий базовому итератору, поэтому при базовом итераторе на 'c' мы получаем 'b'.

Пример

Давайте получим базовый итератор из reverse_iterator с помощью метода base и изменим элемент через обратный итератор:

#include <iostream> #include <vector> #include <iterator> using namespace std; int main() { vector<int> vec = {1, 2, 3, 4, 5}; reverse_iterator<vector<int>::iterator> rit = vec.rbegin(); *rit = 10; for (int num : vec) { cout << num << " "; } cout << endl; cout << *rit.base() << endl; return 0; }

Результат выполнения кода:

1 2 3 4 10 5

Метод base возвращает базовый итератор, который указывает на элемент, следующий за текущим элементом обратного итератора. В данном случае rit указывает на последний элемент 10, а rit.base указывает на позицию за последним элементом, поэтому разыменование даёт неопределённое поведение.

Смотрите также

  • метод rbegin,
    который возвращает обратный итератор на последний элемент контейнера
  • метод rend,
    который возвращает обратный итератор на позицию перед первым элементом
  • функция make_reverse_iterator,
    которая создаёт обратный итератор из обычного
  • класс iterator,
    который представляет базовый интерфейс итераторов
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить