C++ <array> operator[] 运算符
在访问 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。
- 类型:
函数说明
- 返回值: 返回指定位置元素的引用。如果容器是常量容器,则返回常量引用。
- 效果: 返回指定位置的元素。不会进行边界检查,越界访问的结果是未定义的。
- 与 at() 的区别:
operator[]不进行边界检查,速度稍快;at()会进行边界检查,越界时抛出异常。
实例
让我们通过一系列从简单到复杂的例子,彻底掌握 operator[] 的用法。
示例 1:基础用法 - 访问元素
实例
#include <iostream>
#include <array>
int main() {
// 1. 创建一个 array 并初始化
std::array<int, 5> numbers = {10, 20, 30, 40, 50};
std::cout << "array的大小是: " << 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;
}
#include <array>
int main() {
// 1. 创建一个 array 并初始化
std::array<int, 5> numbers = {10, 20, 30, 40, 50};
std::cout << "array的大小是: " << 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 <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 << "修改后: ";
for(size_t i = 0; i < numbers.size(); ++i) {
std::cout << numbers[i] << " ";
}
std::cout << std::endl;
return 0;
}
#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 << "修改后: ";
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[]返回的是可修改的左值引用。
示例 3:范围 for 循环
可以使用范围 for 循环遍历 array。
实例
#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;
}
#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 循环是访问 array 元素的简洁方式。
- 与
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;
}
#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[]可以在算法中快速访问 array 元素。 - 点积的计算就是对应位置元素相乘后求和。

C++ 容器类 <array>