Ответ
Forward iterator (однонаправленный итератор) — это одна из категорий итераторов в C++, которая расширяет возможности input_iterator и output_iterator. Он гарантирует возможность многократного прохода по одному и тому же диапазону и сохранение валидности других итераторов на ту же последовательность при инкременте.
Требования (концепт std::forward_iterator с C++20):
- Поддерживает чтение (
*it) и запись (*it = value) (если не константный). - Допускает инкремент (
++it,it++). - Многопроходность: диапазон можно проходить несколько раз.
- Стабильность ссылок: значение, полученное разыменованием, остаётся валидным до тех пор, пока итератор не инвалидируется другими операциями (например, удалением элемента).
- Поддерживает сравнение на равенство/неравенство (
==,!=).
Контейнеры, использующие forward iterators:
std::forward_liststd::unordered_set,std::unordered_multisetstd::unordered_map,std::unordered_multimap
Пример с std::forward_list:
#include <forward_list>
#include <iostream>
int main() {
std::forward_list<int> flist = {10, 20, 30, 40};
// forward_iterator позволяет проходить по списку только вперёд
for (auto it = flist.begin(); it != flist.end(); ++it) {
std::cout << *it << ' '; // Чтение
*it += 5; // Запись (изменение значения)
}
std::cout << 'n';
// Многопроходность: можно снова пройти по тому же диапазону
for (const auto& val : flist) {
std::cout << val << ' '; // Выведет: 15 25 35 45
}
return 0;
}
Отличие от более мощных итераторов: Forward iterator не поддерживает декремент (--) и арифметику указателей (произвольный доступ), в отличие от bidirectional_iterator (например, у std::list) и random_access_iterator (например, у std::vector).