← Назад к вопросам

Какие знаешь итераторы?

1.3 Junior🔥 271 комментариев
#STL контейнеры и алгоритмы

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Какие знаешь итераторы?

Итераторы — это одна из центральных абстракций в C++ STL. Это обобщение указателей, позволяющее единообразно работать с разными контейнерами.

Категории итераторов

Итераторы организованы в иерархию по мощности:

1. Random Access Iterator (самый мощный)

Позволяет произвольный доступ, как обычный указатель: доступ по индексу O(1), арифметика, сложение с числом, сравнение.

Контейнеры: std::vector, std::deque, std::array, std::string

2. Bidirectional Iterator

Можно идти вперёд и назад. Но NO random access.

Контейнеры: std::list, std::set, std::map, std::multiset, std::multimap

3. Forward Iterator

Только вперёд, одна позиция за раз.

Контейнеры: std::forward_list, std::unordered_set, std::unordered_map

4. Input Iterator

Можно только читать, одна позиция за раз. Примеры: std::istream_iterator, std::istreambuf_iterator.

5. Output Iterator

Можно только писать. Примеры: std::back_insert_iterator, std::front_insert_iterator, std::ostream_iterator.

Адаптеры итераторов

Reverse Iterator

Итерирует в обратном направлении. Используй vec.rbegin() и vec.rend().

Const Iterator

Доступ только для чтения. Используй vec.cbegin() и vec.cend().

Move Iterator

Позволяет переместить элементы при копировании через std::make_move_iterator().

Инвалидация итераторов

При изменении контейнера старые итераторы могут стать недействительны. Правила различаются:

  • vector: Любое изменение может инвалидировать все итераторы
  • deque: Изменения в начале/конце инвалидируют только в этом месте
  • list: Вставка/удаление инвалидирует только итератор на удалённый элемент
  • map/set: Удаление инвалидирует только итератор на удалённый элемент

Пользовательские итераторы

Можно писать собственные итераторы, реализуя необходимые операторы (*, ++, --, ==, != и т.д.).

Работа с алгоритмами

Итераторы позволяют единообразно работать с разными контейнерами:

std::vector<int> vec = {3, 1, 4};
std::list<int> list = {3, 1, 4};

std::find(vec.begin(), vec.end(), 4);    // vector
std::find(list.begin(), list.end(), 4);  // list

C++20: Ranges и View

В C++20 появились ranges, которые обобщают итераторы и позволяют писать более выразительный код с фильтрацией и трансформацией.

Итераторы — это абстракция, которая делает C++ STL мощной и гибкой. Правильное понимание их поведения критично для эффективного использования контейнеров и алгоритмов.

Какие знаешь итераторы? | PrepBro