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() 支持 |
| 性能 | 极高 | 极高 | 略低(动态分配) |
| 传递到函数 | 可直接传值 | 退化为指针 | 可传引用/值 |
更多推荐



所有评论(0)