Какие способы обхода массива (array) в C++ ты знаешь?

«Какие способы обхода массива (array) в C++ ты знаешь?» — вопрос из категории Алгоритмы и структуры данных, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В C++ есть несколько способов обхода массивов, выбор зависит от типа массива (C-style или STL-контейнер) и версии стандарта.

  1. Классический цикл for с индексом — универсальный способ для массивов в стиле C и контейнеров с оператором [].
    int arr[5] = {1, 2, 3, 4, 5};
    for (size_t i = 0; i < 5; ++i) {
        std::cout << arr[i] << ' ';
    }
  2. Цикл for с использованием указателей — низкоуровневый подход, основанный на арифметике указателей.
    int* begin = arr;
    int* end = arr + 5;
    for (int* ptr = begin; ptr != end; ++ptr) {
        std::cout << *ptr << ' ';
    }
  3. Range-based for loop (C++11) — самый современный и безопасный способ для любых диапазонов (STL-контейнеры, C-массивы, списки инициализации).
    for (int value : arr) {
        std::cout << value << ' ';
    }
    // Для избежания копирования больших объектов используйте ссылку:
    for (const auto& value : arr) { /* ... */ }
  4. Использование итераторов — стандартный способ для STL-контейнеров (std::vector, std::array, std::list).
    std::vector<int> vec = {1, 2, 3};
    for (auto it = vec.begin(); it != vec.end(); ++it) {
        std::cout << *it << ' ';
    }
  5. Использование стандартных алгоритмов — декларативный подход, например, с std::for_each.
    #include <algorithm>
    std::for_each(std::begin(arr), std::end(arr), [](int n) {
        std::cout << n << ' ';
    });

Рекомендация: Для современного C++ предпочтительнее использовать range-based for loop или алгоритмы STL, так как они менее подвержены ошибкам (например, выходу за границы).