C++ <array> оператор operator[]

Класс контейнера C++ <array>


Среди всех способов доступа к элементам массива,operator[]является наиболее распространённым и прямым способом, точно так же, как доступ к обычному массиву.

operator[]является оператором индексации классов контейнеров, используемым длявозврата элемента по указанной позиции, но он не выполняет проверку границ. Его использование точно такое же, как у обычного массива C.

operator[]обеспечивает возможность произвольного доступа, как у массива, позволяя быстро получать доступ к элементам в любой позиции.

Определения слов: operator[]— это оператор индексирования, а квадратные скобки — символ доступа к массиву.


Базовый синтаксис и параметры

operator[]— это функция-член класса контейнера, просто используйте её как массив.

Формат синтаксиса

reference operator[](size_type pos);
const_reference operator[](size_type pos) const;

Описание параметра

  • Параметр: pos
    • Тип:size_type(беззнаковый целочисленный тип, обычноsize_t)
    • Описание: позиция (индекс) элемента, к которому осуществляется доступ. Индекс начинается с 0, а максимальный допустимый индекс равенsize() - 1。

Описание функции

  • Возвращаемое значение: возвращаетссылкуна элемент в указанной позиции. Если контейнер является const-контейнером, возвращается const-ссылка.
  • Действие: возвращает элемент в указанной позиции. Проверка границ не выполняется; доступ за пределами границ приводит к неопределённому поведению.
  • отличие от at(): operator[]не выполняет проверку границ, немного быстрее;at()выполняет проверку границ и выбрасывает исключение при выходе за границы.

Пример

Давайте досконально освоим его на серии примеров от простого к сложному.operator[]Использование.

Пример 1: базовое использование — доступ к элементам

Пример

#include <iostream>
#include <array>

int main() {
    // 1. Создать массив и инициализировать его
    std::array<int, 5> numbers = {10, 20, 30, 40, 50};

    std::cout << "Размер массива: " << numbers.size() << std::endl;

    // 2. Используйте operator[] для доступа к элементам
    std::cout << "Первый элемент [0]: " << numbers[0] << std::endl;
    std::cout << "Второй элемент [1]: " << numbers[1] << std::endl;
    std::cout << "Третий элемент [2]: " << numbers[2] << std::endl;
    std::cout << "Последний элемент [4]: " << numbers[4] << std::endl;

    // 3. Использование цикла для доступа ко всем элементам
    std::cout << "Все элементы: ";
    for(size_t i = 0; i < numbers.size(); ++i) {
        std::cout << numbers[i] << " ";
    }
    std::cout << std::endl;

    return 0;
}

Ожидаемый вывод:

array的大小是: 5
第一个元素 [0]: 10
第二个元素 [1]: 20
第三个元素 [2]: 30
最后一个元素 [4]: 50
所有元素: 10 20 30 40 50

Анализ кода:

  1. numbers[0]Возвращает первый элемент10(индекс начинается с 0).
  2. numbers[4]возвращает последний элемент50(потому чтоsize()равно 5, а допустимые индексы — 0-4).
  3. используя циклы иoperator[]может перебирать все элементы, и его использование точно такое же, как у массива C.

Пример 2: изменение значений элементов

operator[]возвращает ссылку, поэтому его можно использовать для изменения значения элемента.

Пример

#include <iostream>
#include <array>

int main() {
    std::array<int, 3> numbers = {10, 20, 30};

    std::cout << "До изменения: ";
    for(size_t i = 0; i < numbers.size(); ++i) {
        std::cout << numbers[i] << " ";
    }
    std::cout << std::endl;

    // Используйте operator[] для получения ссылки и изменения элементов
    numbers[0] = 100;
    numbers[1] = 200;
    numbers[2] = 300;

    std::cout << "After modification: ";
    for(size_t i = 0; i < numbers.size(); ++i) {
        std::cout << numbers[i] << " ";
    }
    std::cout << std::endl;

    return 0;
}

Ожидаемый вывод:

修改前: 10 20 30
修改后: 100 200 300

Анализ кода:

  • numbers[0] = 100;Значение первого элемента было изменено через ссылку.
  • Это демонстрируетoperator[]возвращает изменяемую lvalue-ссылку.

Пример 3: цикл for по диапазону

Вы можете использовать цикл for на основе диапазона для перебора массива.

Пример

#include <iostream>
#include <array>
#include <string>

int main() {
    std::array<std::string, 3> names = {"Alice", "Bob", "Charlie"};

    std::cout << "Все элементы: ";
    for(const auto& name : names) {
        std::cout << name << " ";
    }
    std::cout << std::endl;

    return 0;
}

Ожидаемый вывод:

所有元素: Alice Bob Charlie

Анализ кода:

  • Цикл for на основе диапазона — это лаконичный способ доступа к элементам массива.
  • иoperator[]по сравнению с ..., код более лаконичен и читаем.

Пример 4: вычисление скалярного произведения векторов

Использованиеoperator[]Реализуйте операции с векторами.

Пример

#include <iostream>
#include <array>

// Вычислить скалярное произведение двух векторов
int dotProduct(const std::array<int, 3>& v1, const std::array<int, 3>& v2) {
    int result = 0;
    for(size_t i = 0; i < v1.size(); ++i) {
        result += v1[i] * v2[i];
    }
    return result;
}

int main() {
    std::array<int, 3> v1 = {1, 2, 3};
    std::array<int, 3> v2 = {4, 5, 6};

    int result = dotProduct(v1, v2);

    std::cout << "Вектор v1: ";
    for(size_t i = 0; i < v1.size(); ++i) {
        std::cout << v1[i] << " ";
    }
    std::cout << std::endl;

    std::cout << "Вектор v2: ";
    for(size_t i = 0; i < v2.size(); ++i) {
        std::cout << v2[i] << " ";
    }
    std::cout << std::endl;

    std::cout << "Скалярное произведение: " << result << std::endl;
    // 1*4 + 2*5 + 3*6 = 4 + 10 + 18 = 32

    return 0;
}

Ожидаемый вывод:

向量 v1: 1 2 3
向量 v2: 4 5 6
点积: 32

Анализ кода:

  • Использованиеoperator[]Вы можете быстро получать доступ к элементам массива в алгоритмах.
  • Скалярное произведение вычисляется путем умножения соответствующих элементов и последующего суммирования.

Класс контейнера C++ <array>

Другие расширения