Итераторы
Одним из способов перебора элементов в
контейнерах (структурах данных) является
итератор (
iterator
)
, которые бывают нескольких типов.
Итератор - структура данных, которая «указывает» на некоторый элемент контейнера, и (для некоторых контейнеров) умеет переходить к предыдущему/следующему элементу.
Для вектора используется самый мощный -
итератор с произвольным доступом (
random-access Iterator
). Итератор с произвольным доступом помимо последовательного перемещения может обратиться к произвольному элементу вектора.
Преимущества итераторов
1) При удалении элементов и переборе элементов с помощью индексов (
[]
) нам надо все время следить за количеством оставшихся элементов, чтобы не выйти за пределы вектора, а с помощью итератора можно использовать
end()
, указывающий на конец вектора.
2) С помощью итератора можно легко динамически удалять и вставлять элементы в векторе.
Объявление итератора
1) Объявление итератора для целочисленного вектора и указание его на
первый элемент в векторе.
vector <int> myvector = { 1, 2, 3, 4, 5 };
vector <int>::iterator it = myvector.begin();
2) Объявление итератора для целочисленного вектора и указание его на элемент после
последнего в векторе.
vector <int> myvector = { 1, 2, 3, 4, 5 };
vector <int>::iterator it = myvector.end(); // указывает на элемент после последнего,
vector <int>::iterator it1 = myvector.end() - 1 ; // указание на последний элемент.
Получение и вывод значения
Получение и вывод элемента на который указывает итератор.
cout << *it;
Перемещение позиции итератора
Перемещение позиции итератора на 3 позиции вперед.
advance(it, 3);
Создание нового итератора на основе существующего
Создание нового итератора на основе существующего с продвижением на 3 позиции.
auto it1 = next(it, 3);
Вывод значений вектора с помощью итератора
vector<int>::iterator it;
for (it = myvector.begin(); it != myvector.end(); ++it) {
cout<<*it<<" ";
}
Обход вектора
Для обхода вектора от последнего элемента к первому используется обратный итератор
reverse_iterator
, его получение обеспечивают:
1)
rbegin()
- возвращает обратный итератор, указывающий на последний элемент вектора, применение операции
++
приводит к переходу на предыдущий элемент;
2)
rend()
- возвращает обратный итератор, указывающий на предшествующий первому элемент вектора, применение операции ++ приводит к переходу на следующий.
vector<int>::reverse_iterator it = myvector.rbegin(); // указывает на последний элемент
vector<int>::reverse_iterator it = myvector.rend(); // указывает на элемент,
// который стоит до первого,