STL(Standard Template Library)中的std::array
是C++11引入的一个模板类,用于表示固定大小的数组。与传统的C++静态数组相比,它具有一些额外的功能,例如可以使用STL算法、内置边界检查等,但大小依然在编译时确定。
std::array
的原理
std::array
是一个轻量的容器,封装了C++的传统静态数组,并提供了与STL容器一致的接口。与传统数组不同的是,它具有面向对象的特性,支持诸如size()
、at()
等成员函数,并且与STL算法可以直接配合使用。
常见操作
-
声明和初始化: 和传统数组类似,可以在声明时初始化,大小必须是编译时常量。
-
访问元素: 通过
[]
运算符或at()
方法访问元素,at()
会进行边界检查,越界时会抛出异常。 -
迭代遍历: 可以使用传统的
for
循环,也可以使用范围for
循环。 -
与STL算法兼容:
std::array
与STL算法函数很好地集成,如std::sort
、std::find
等。
std::array
使用示例
#include <iostream>
#include <array> // 引入 std::array 头文件
#include <algorithm> // 引入STL算法
int main() {
// 声明并初始化一个包含5个元素的std::array
std::array<int, 5> myArray = {10, 20, 30, 40, 50};
// 使用下标运算符访问元素
std::cout << "First element: " << myArray[0] << std::endl;
// 使用 at() 方法访问元素(带边界检查)
try {
std::cout << "Element at index 2: " << myArray.at(2) << std::endl; // 正常访问
std::cout << "Element at index 5: " << myArray.at(5) << std::endl; // 越界访问,抛出异常
} catch (const std::out_of_range& e) {
std::cerr << "Out of range error: " << e.what() << std::endl;
}
// 获取数组的大小
std::cout << "Array size: " << myArray.size() << std::endl;
// 遍历数组
std::cout << "Array elements: ";
for (const auto& elem : myArray) {
std::cout << elem << " ";
}
std::cout << std::endl;
// 使用STL算法(例如排序)
std::sort(myArray.begin(), myArray.end());
std::cout << "Sorted elements: ";
for (const auto& elem : myArray) {
std::cout << elem << " ";
}
std::cout << std::endl;
return 0;
}
常见成员函数
at(size_t index)
:带边界检查的元素访问函数,越界会抛出std::out_of_range
异常。operator[]
:传统的下标运算符,不进行边界检查。size()
:返回数组的大小,编译时常量。front()
和back()
:分别返回数组的第一个和最后一个元素。fill(value)
:将数组的所有元素设置为指定值。swap(array)
:交换两个数组的内容。
注意事项
- 固定大小:
std::array
的大小是固定的,不能在运行时调整,大小必须在编译时已知。 - 性能:
std::array
的性能和传统的C++静态数组相近,因其在栈上分配内存。 - 边界检查:使用
at()
进行元素访问可以避免越界访问导致的未定义行为。
优缺点
-
优点:
- 封装了传统数组,具有STL容器的接口。
- 支持边界检查,减少数组越界带来的问题。
- 与STL算法直接兼容。
-
缺点:
- 数组大小在编译时固定,无法动态调整。