✨博客主页 | ||
---|---|---|
何曾参静谧的博客 | ||
📌文章专栏 | ||
「C/C++」C/C++程序设计 | ||
📚全部专栏 | ||
「VS」Visual Studio | 「C/C++」C/C++程序设计 | 「UG/NX」BlockUI集合 |
「Win」Windows程序设计 | 「DSA」数据结构与算法 | 「UG/NX」NX二次开发 |
「QT」QT5程序设计 | 「File」数据文件格式 | 「PK」Parasolid函数说明 |
目录
- std::array容器深度解析
- 一、函数构造
- 二、对象初始化
- 三、元素访问
- 四、迭代器
- 五、容器特性
- 六、元素比较
- 总结
std::array容器深度解析
std::array
是C++11标准库中引入的一个固定大小的数组容器。与原生数组相比,std::array
提供了更多的功能和更高的安全性,包括边界检查、迭代器支持和一系列实用的成员函数。本文将从函数构造、对象初始化、元素访问、迭代器、容器特性和元素比较等方面,对std::array
进行全面解析。
一、函数构造
std::array
的构造函数根据其大小和元素类型在编译时确定,因此它的大小是固定的,无法在运行时改变。以下是std::array
的主要构造函数:
-
默认构造函数:创建一个所有元素都初始化为默认值的
std::array
。std::array<int, 5> arr; // 所有元素初始化为0(对于int类型)
-
有参构造函数:创建一个用指定值填充的
std::array
。std::array<int, 5> arr(7); // 所有元素初始化为7
-
列表初始化:通过初始化列表直接设置
std::array
的值。std::array<int, 5> arr = {1, 2, 3, 4, 5};
-
拷贝构造函数:通过另一个
std::array
对象来构造新的std::array
。std::array<int, 5> arr1 = {1, 2, 3, 4, 5}; std::array<int, 5> arr2(arr1); // arr2与arr1具有相同的值
-
移动构造函数(C++11及以上):通过移动另一个
std::array
对象来构造新的std::array
,避免不必要的复制。std::array<int, 5> arr1 = {1, 2, 3, 4, 5}; std::array<int, 5> arr2(std::move(arr1)); // arr2接管arr1的资源,arr1变为未定义状态
二、对象初始化
除了构造函数之外,std::array
还支持多种初始化方式,包括聚合初始化和列表初始化。在C++11及更高版本中,列表初始化尤为常用,因为它既简洁又直观。
// 聚合初始化(C++98/03)
int arr_data[5] = {1, 2, 3, 4, 5};
std::array<int, 5> arr_old(std::begin(arr_data), std::end(arr_data)); // 不推荐,因为需要额外的数组和迭代器// 列表初始化(C++11及以上)
std::array<int, 5> arr = {1, 2, 3, 4, 5}; // 推荐方式
三、元素访问
std::array
提供了多种访问元素的方式,包括使用下标运算符[]
、at
成员函数以及front
和back
成员函数。
-
下标运算符
[]
:int value = arr[2]; // 访问第三个元素,没有边界检查
-
at
成员函数:try {int value = arr.at(2); // 访问第三个元素,带边界检查 } catch (const std::out_of_range& e) {std::cerr << "Out of range: " << e.what() << std::endl; }
-
front
和back
成员函数:int first = arr.front(); // 访问第一个元素 int last = arr.back(); // 访问最后一个元素
四、迭代器
std::array
支持迭代器,包括正向迭代器、反向迭代器、常量迭代器以及常量反向迭代器。这些迭代器允许你以标准库算法兼容的方式遍历std::array
中的元素。
// 使用正向迭代器遍历
for (auto it = arr.begin(); it != arr.end(); ++it) {std::cout << *it << " ";
}
std::cout << std::endl;// 使用反向迭代器遍历
for (auto it = arr.rbegin(); it != arr.rend(); ++it) {std::cout << *it << " ";
}
std::cout << std::endl;
五、容器特性
作为容器,std::array
具有一些基本但重要的特性:
- 大小固定:
std::array
的大小在编译时确定,且无法更改。 - 连续存储:
std::array
的元素在内存中是连续存储的,这意味着你可以像使用原生数组一样使用指针操作。 - 内置成员函数:
std::array
提供了许多实用的成员函数,如size
、max_size
、empty
(总是返回false
,因为std::array
总是非空的,只是元素可能未初始化)等,用于获取容器的基本信息。
#include <iostream>
#include <array>
using namespace std;int main()
{std::array<int, 5> arr1 = {1, 2, 3, 4, 5};if(arr1.empty()) std::cout << "arr1 is empty" << std::endl; // 输出此句arr1.size();std::cout << arr1.size() << std::endl; // 输出 5arr1.max_size();std::cout << arr1.max_size() << std::endl; // 输出 5return 0;
}
六、元素比较
std::array
支持元素之间的比较操作,因为它重载了比较运算符(==
、!=
、<
、<=
、>
、>=
)。这些运算符按元素顺序逐个比较两个std::array
对象,直到找到不相等的元素或比较完所有元素。
std::array<int, 5> arr1 = {1, 2, 3, 4, 5};
std::array<int, 5> arr2 = {1, 2, 3, 4, 5};
std::array<int, 5> arr3 = {1, 2, 3, 6, 5};if (arr1 == arr2) {std::cout << "arr1 is equal to arr2" << std::endl; // 输出此句
}if (arr1 != arr3) {std::cout << "arr1 is not equal to arr3" << std::endl; // 输出此句
}
需要注意的是,只有当两个std::array
对象的大小和元素类型都相同时,比较操作才是有效的。如果大小或元素类型不同,则比较操作会导致编译错误。
总结
std::array
是一个简单而强大的容器,特别适用于需要固定大小数组的场景。它提供了比原生数组更多的功能和更高的安全性,包括边界检查、迭代器支持和元素比较等。通过本文的解析,相信你对std::array
有了更深入的了解,并能够在实际编程中灵活运用它。