C++容器array
C++容器array
- 定义
- 初始化
- 默认初始化
- 列表初始化
- 常用函数
- 迭代
- 其他
定义
std::array是一个定长容器,其大小在编译时就必须确定,之后不能改变- 通常分配在栈上,使用连续的栈内存布局,这使得它在性能上很接近 C 风格的数组
- 与 C 风格数组不同,
std::array不会自动退化为指针,提供了更好的类型安全性
初始化
默认初始化
不提供初始值,所有元素将执行默认初始化。对于内置类型如 int,这意味着元素值未定义(包含"垃圾值")
std::string getStringFromU8string(const std::u8string& u8str) {return std::string(reinterpret_cast<const char*>(u8str.data()), u8str.size());
}std::u8string getU8stingFromString(const std::string& str) {return std::u8string(reinterpret_cast<const char8_t*>(str.data()), str.size());
}int main()
{system("chcp 65001");std::array<int, 4> arr1;for (auto it : arr1){cout << "arr1-> " << it << endl;}std::array<std::u8string, 4> arr2;for (auto it : arr2){cout << "arr2-> " << getStringFromU8string(it) << endl;}
}
列表初始化
数组长度超过实际元素个数,剩余元素会初始化默认值
int main()
{system("chcp 65001");std::array<std::u8string, 2> arr1 = { u8"张三", u8"李四" };for (auto it : arr1){cout << "arr1-> " << getStringFromU8string(it) << endl;}std::array<std::u8string, 4> arr2{ u8"北京", u8"上海", u8"广州", u8"深圳" };for (auto it : arr2){cout << "arr2-> " << getStringFromU8string(it) << endl;}// 自动推导std::array arr3 = { u8"张三", u8"李四" };auto arr4 = { u8"北京", u8"上海", u8"广州", u8"深圳" };for (auto it : arr3){cout << "arr3-> " << getStringFromU8string(it) << endl;}for (auto it : arr4){cout << "arr4-> " << getStringFromU8string(it) << endl;}
}
常用函数
| 方法 | 功能说明 |
|---|---|
at(index) | 安全访问元素,越界时抛出 std::out_of_range 异常 |
operator[] | 直接访问元素(不检查边界) |
front() | 返回第一个元素 |
back() | 返回最后一个元素 |
data() | 返回指向内部数组首元素的指针(可用于 C API) |
empty() | 如果大小为 0 返回 true(对于非零大小的 array 总是 false) |
size() | 返回元素个数(编译时常量) |
max_size() | 返回最大可能大小(通常等于 size()) |
fill(value) | 将所有元素设置为指定值 |
swap(other) | 与另一个 array 交换内容 |
int main()
{system("chcp 65001");std::array<std::u8string, 4> arr1{ u8"北京", u8"上海", u8"广州", u8"深圳" };cout << "arr1.size()= " << arr1.size() << endl;cout << "arr1.max_size()= " << arr1.max_size() << endl;cout << "arr1.empty()= " << boolalpha << arr1.empty() << endl;cout << "arr1[1]= " << getStringFromU8string(arr1[1]) << endl;cout << "arr1.at(0)= " << getStringFromU8string(arr1.at(0)) << endl;// 第一个元素cout << "arr1.front()= " << getStringFromU8string(arr1.front()) << endl;// 最后一个元素cout << "arr1.back()= " << getStringFromU8string(arr1.back()) << endl;// 数组首元素的指针std::u8string* ptr = arr1.data();for (int i = 0; i < arr1.size(); i++){cout << getStringFromU8string(ptr[i]) << endl;}// 将所有元素设置为指定值arr1.fill(u8"张三");for (auto it : arr1){cout << getStringFromU8string(it) << endl;}// 与另一个 array 交换内容std::array<std::u8string, 4> arr2{ u8"北京", u8"上海", u8"广州", u8"深圳" };arr1.swap(arr2);for (auto it : arr1){cout << "arr1-> " << getStringFromU8string(it) << endl;}for (auto it : arr2){cout << "arr2-> " << getStringFromU8string(it) << endl;}
}
迭代
常用
for,begin-end,rbegin-rend
int main()
{system("chcp 65001");std::array<std::u8string, 4> arr1{ u8"北京", u8"上海", u8"广州", u8"深圳" };// for循环for (auto it : arr1) {cout << getStringFromU8string(it) << endl;}// begin-end正向遍历for (auto it = arr1.begin(); it != arr1.end(); it++){cout << "begin-end " << getStringFromU8string(*it) << endl;}// cbegin-cend正向遍历for (auto it = arr1.cbegin(); it != arr1.cend(); it++){cout << "cbegin-cend " << getStringFromU8string(*it) << endl;}// rbegin-rend反向遍历for (auto it = arr1.rbegin(); it != arr1.rend(); it++){cout << "rbegin-rend " << getStringFromU8string(*it) << endl;}
}
其他
| 特性 | std::array | 原生数组 | std::vector |
|---|---|---|---|
| 大小是否固定 | 是 | 是 | 否 |
| 内存位置 | 栈(通常) | 栈/静态区 | 堆 |
| 支持拷贝赋值 | ✅ | ❌ | ✅ |
| 支持 STL 算法 | ✅ | ❌(需指针) | ✅ |
| 越界检查 | at() 支持 | 不支持 | at() 支持 |
| 性能 | 极高 | 极高 | 略低(动态分配) |
| 传递到函数 | 可直接传值 | 退化为指针 | 可传引用/值 |
