C++11——std::array
std::array<> 是在 c++11 中引入的,它是旧 C 风格数组的包装器,具有额外的优势。
它是一种具有恒定大小元素的顺序容器。
std::array 内部定义为类模板,即
template < class T, size_t N > class array;
这里第一个模板参数 T 是要存储在数组中的元素类型,第二个模板参数即
size_t N 是一个常数,表示数组中元素的数量。
std::array 所需的头文件即
#include <array>
定义和初始化 std::array<> 对象
std::array<int, 10> arr;
此处,std::array 对象 arr 表示一个固定大小为 10 且未初始化的 int 数组,因此所有 10 个元素都包含垃圾值。
std::array < std::string, 200 > arr1;
这里,std::array 对象 arr1 表示一个固定大小为 200 的字符串数组。
// 前 2 个值将被初始化,其他值为 0。 std::array < int , 10 > arr3 = { 34, 45 } ;
如果我们在初始化期间提供较少数量的元素,则剩余的将使用默认值进行初始化。就像 int 为 0 的情况一样。所以, arr3 包含,
34, 45, 0, 0, 0, 0, 0, 0, 0,
std::array 还提供了一个成员函数 fill() 来一次性为所有元素设置相同的值。当我们有大数组时很容易。
std::array<int, 10> arr4; // Fill all elements in array with same value arr4.fill(4);
所以,arr4 包含
4,4,4,4,4,4,4,4,4,4
#include <iostream> #include <array> void printArray(std::array<int, 10>& arr) { // Printing array for (auto& elem : arr) std::cout << elem << " , "; std::cout << std::endl; } int main() { // Uninitialized array object contains elements with // garbage values std::array<int, 10> arr1; printArray(arr1); // Initialized array object std::array<int, 10> arr2 = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; printArray(arr2); // First 2 values will be initialized and others will be 0. std::array<int, 10> arr3 = { 34, 45 }; printArray(arr3); std::array<int, 10> arr4; // Fill all elements in array with same value arr4.fill(4); printArray(arr4); return 0; }
如何获取 std::array 的大小
std::array 对象的大小始终是常量,即它的第二个模板参数。但是,std::array 提供了一个成员函数 size() 来返回大小即
// Returns the constant size arr.size();
如何访问 std::array 中的元素
有 3 种方法可以访问 std::array 中的元素
// 创建并初始化一个大小为 10 的数组。 std::array < int , 10 > arr = { 1,2,3,4,5,6,7,8,9,10 } ;
运算符 []:使用运算符 [] 访问 std::array 中的元素
int x = arr [ 2 ] ;
使用 [] 运算符访问超出范围的元素将导致未定义的行为。
at() : 使用 at() 成员函数访问 std::array 中的元素
// Accessing element using at() function int x = arr.at(2);
使用 at() 函数访问任何超出范围的元素将抛出out_of_range异常。
std::tuple 的 get<>()
int x = std::get < 2 >( arr ) ;
使用 get<> 运算符访问超出范围的元素将导致编译时错误。
完整的例子如下,
#include <iostream> #include <array> int main() { // Creating and initializing an array of size 10. std::array<int, 10> arr = { 1,2,3,4,5,6,7,8,9,10 }; // Random access operator [] to fetch any element from array int x = arr[2]; std::cout << "x = " << x << std::endl; // Accessing out of range elements using [] leads to undefined behaviour // i.e. it can give garbage value or crash x = arr[12]; std::cout << "x = " << x << std::endl; // Accessing element using at() function x = arr.at(2); std::cout << "x = " << x << std::endl; // Accessing out of range elements using at() will throw exception try { x = arr.at(12); } catch (const std::out_of_range& exp) { std::cerr << exp.what() << std::endl; } // Accessing elements from std::array object using std::get<>() x = std::get<2>(arr); // Accessing out of range elements using std::get<>() will throw error at compile time //x = std::get<12>(arr); std::cout << "x = " << x << std::endl; return 0; }
Output:
x = 3 x = -927490112 x = 3 array::at: __n (which is 12) >= _Nm (which is 10) x = 3