C++ <array> оператор operator[]
Среди всех способов доступа к элементам массива,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 <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
Анализ кода:
numbers[0]Возвращает первый элемент10(индекс начинается с 0).numbers[4]возвращает последний элемент50(потому чтоsize()равно 5, а допустимые индексы — 0-4).- используя циклы и
operator[]может перебирать все элементы, и его использование точно такое же, как у массива C.
Пример 2: изменение значений элементов
operator[]возвращает ссылку, поэтому его можно использовать для изменения значения элемента.
Пример
#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 <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 <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[]Вы можете быстро получать доступ к элементам массива в алгоритмах. - Скалярное произведение вычисляется путем умножения соответствующих элементов и последующего суммирования.
Другие расширения