Что такое forward_iterator в C++?

«Что такое forward_iterator в C++?» — вопрос из категории STL, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Forward iterator (однонаправленный итератор) — это одна из категорий итераторов в C++, которая расширяет возможности input_iterator и output_iterator. Он гарантирует возможность многократного прохода по одному и тому же диапазону и сохранение валидности других итераторов на ту же последовательность при инкременте.

Требования (концепт std::forward_iterator с C++20):

  • Поддерживает чтение (*it) и запись (*it = value) (если не константный).
  • Допускает инкремент (++it, it++).
  • Многопроходность: диапазон можно проходить несколько раз.
  • Стабильность ссылок: значение, полученное разыменованием, остаётся валидным до тех пор, пока итератор не инвалидируется другими операциями (например, удалением элемента).
  • Поддерживает сравнение на равенство/неравенство (==, !=).

Контейнеры, использующие forward iterators:

  • std::forward_list
  • std::unordered_set, std::unordered_multiset
  • std::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).