Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+717новых вакансий за сутки·60 871вакансия открыта сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании5 951
РезюмеAIПодготовкаСтатьи
ТарифыТарифы
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 391 кандидат открыт к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python9 224
  • Облачные технологии6 770
  • QA вакансии2 176
  • Android1 322
  • Инженер данных940
  • Продакт-менеджер435

Разработка

  • Backend вакансии1 317
  • iOS1 239
  • AI вакансии608
  • Fullstack вакансии523
  • Frontend вакансии456
  • Mobile вакансии28

По стеку

  • Go5 445
  • Java3 175
  • Kotlin1 119
  • Node.js1 026
  • Rust949
  • .NET666
  • PHP311
  • C++273
  • C#210

DevOps и инфраструктура

  • Kubernetes4 025
  • Linux-инфраструктура3 060
  • DevOps вакансии2 713
  • Terraform / IaC2 214
  • Мониторинг и Observability1 106
  • CI/CD919
  • SRE341
  • Кибербезопасность90

Аналитика и данные

  • Аналитик данных555
  • Data Scientist513
  • Бизнес-аналитик431
  • Системный аналитик65

Другие направления

  • Проджект-менеджер160
  • UI/UX дизайн77
  • Ручное тестирование14

По регионам

  • Вакансии в США29 375
  • Вакансии в Европе11 048
  • Работа в России3 627
  • Вакансии в Канаде2 514

По формату

  • Удалённые вакансии48 640
  • Релокация в США29 375
  • Гибридная работа5 790
  • Офисная работа4 553

По уровню

  • Senior вакансии25 029
  • Middle вакансии13 245
  • Junior вакансии4 377

Сейчас нанимают

Все компании
  • Wise191 вакансия
  • Rakuten188 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Celonis48 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме C++Все вопросы
C++MiddleТеория

Что такое iterator и каковы различные категории итераторов?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Итератор — обобщение указателя. Иерархия: Input/Output → Forward → Bidirectional → Random Access → Contiguous. C++20 заменяет tag dispatching на concepts (std::random_access_iterator и др.).

C++20: iterator concepts

В C++20 иерархия переработана через concepts. Стандарт добавил std::input_or_output_iterator, std::forward_iterator, std::bidirectional_iterator, std::random_access_iterator, std::contiguous_iterator. Это позволяет писать constraint-based алгоритмы:

#include <iterator>
#include <vector>
#include <list>
#include <forward_list>
#include <iostream>

// Функция, работающая только с random access итераторами
template<std::random_access_iterator It>
void jump_to_middle(It begin, It end) {
    auto mid = begin + (end - begin) / 2;
    std::cout << "middle value: " << *mid << "\n";
}

// Функция, работающая с любым input iterator
template<std::input_iterator It>
void print_all(It begin, It end) {
    for (auto it = begin; it != end; ++it) {
        std::cout << *it << " ";
    }
    std::cout << "\n";
}

int main() {
    std::vector<int> v = {1, 2, 3, 4, 5};
    std::list<int>   l = {10, 20, 30};
    std::forward_list<int> fl = {100, 200};

    jump_to_middle(v.begin(), v.end()); // OK — vector имеет random access
    // jump_to_middle(l.begin(), l.end()); // ОШИБКА компиляции — list bidirectional

    print_all(v.begin(), v.end());
    print_all(l.begin(), l.end());
    print_all(fl.begin(), fl.end());

    // Проверка категории через iterator_traits
    using VecIt = std::vector<int>::iterator;
    static_assert(std::random_access_iterator<VecIt>);
    static_assert(std::contiguous_iterator<VecIt>);

    using ListIt = std::list<int>::iterator;
    static_assert(std::bidirectional_iterator<ListIt>);
    static_assert(!std::random_access_iterator<ListIt>);
}

Итераторы в C++: концепция и иерархия категорий

Итератор — объект, предоставляющий унифицированный интерфейс доступа к элементам контейнера или диапазона. Итераторы обобщают указатели: каждый сырой указатель является валидным итератором.

Иерархия категорий (C++17 и ранее)

Категории образуют иерархию от наименее мощных к наиболее мощным:

  • Input Iterator — однопроходное чтение, движение только вперёд. Пример: std::istream_iterator.
  • Output Iterator — однопроходная запись, движение только вперёд. Пример: std::ostream_iterator, std::back_insert_iterator.
  • Forward Iterator — многопроходное чтение/запись, движение вперёд. Пример: std::forward_list::iterator.
  • Bidirectional Iterator — дополнительно поддерживает --. Пример: std::list::iterator, std::map::iterator.
  • Random Access Iterator — поддерживает +n, -n, [], сравнение <. Пример: std::vector::iterator, сырые указатели.
  • Contiguous Iterator (C++17) — Random Access + гарантия смежного расположения в памяти. Пример: std::vector::iterator, std::array::iterator.

iterator_traits и tag dispatching (C++17-стиль)

До C++20 категорию итератора определяли через std::iterator_traits<It>::iterator_category:

#include <iterator>

template<typename It>
void advance_impl(It& it, int n, std::random_access_iterator_tag) {
    it += n; // O(1)
}

template<typename It>
void advance_impl(It& it, int n, std::bidirectional_iterator_tag) {
    if (n >= 0) while (n--) ++it;
    else        while (n++) --it; // O(n)
}

template<typename It>
void my_advance(It& it, int n) {
    advance_impl(it, n,
        typename std::iterator_traits<It>::iterator_category{});
}

Sentinel и ranges (C++20)

C++20 вводит понятие sentinel — объекта, обозначающего конец диапазона, который может иметь другой тип, чем итератор. Это позволяет, например, использовать нулевой терминатор строки без вычисления длины.

Подводные камни

  • Инвалидация итераторов: push_back на vector инвалидирует все итераторы при reallocate — использование старого итератора UB.
  • Input iterator — однопроходный: нельзя сохранить копию и пройти диапазон дважды через std::istream_iterator.
  • Output iterator не поддерживает разыменование для чтения — *it возвращает прокси-объект, не значение.
  • std::advance для non-random-access итератора работает за O(n) — не используйте в горячем цикле.
  • std::distance тоже O(n) для bidirectional/forward — лучше хранить размер явно.
  • Сравнение итераторов разных контейнеров — UB, даже если типы совпадают.
  • В C++20 range-based алгоритмы принимают range, а не пару итераторов — старые алгоритмы из <algorithm> и новые из <algorithm> (ranges::) несовместимы напрямую.

Частые вопросы на собеседовании

  • Что такое undefined behavior в C++ и приведите примеры?
  • Что такое smart pointers в C++? Объясните unique_ptr, shared_ptr и weak_ptr.
  • Что такое правило трёх / правило пяти / правило нуля (Rule of Three / Five / Zero)?
  • Что такое RAII (Resource Acquisition Is Initialization) и почему это важно?

Типичные ошибки

  • Объяснять iterator categories только по синтаксису, без жизненного цикла и стоимости.
  • Игнорировать ошибки, null/empty состояния, порядок инициализации или режим сборки.
  • Давать пример, который работает в демо, но ломается при изменении владельца ресурса.
  • Показывать сырой указатель без объяснения владельца и момента освобождения.

Что проверяет интервьюер

  • Кандидат формулирует точную модель для iterator categories, а не только определение.
  • Пример компилируем, безопасен по lifetime и соответствует версии технологии.
  • Названы trade-off, ограничения и диагностируемые симптомы ошибки.

Как вы знаете этот вопрос?

Проверить себя по теме C++ →

Источники

  • https://en.cppreference.com/w/cpp/iterator

Связанные темы

C++Debuggingmemory-managementperformance-tradeoffs

Вакансии с этим навыком

C++ вакансии
  • Senior C++ Software Engineer (#5819)
  • Security Architect
  • Sr. Software Developer - C#/WPF for UI/UX Development
  • Data Scientist (NLP Deep Learning Engineer)
  • Manager, Engineering (Remote Eligible in Bulgaria)