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
原文链接: https://www.cnblogs.com/Galesaur-wcy/p/15589957.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/215005
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!