原文链接
数组介绍
array 是具有固定大小的容器,这就是说,在定义 array 对象时就需要显式指定其所能容纳元素的数目,并且这个数目一经指定就不可再改变了。在创建array时使用初始化列表作为 array 的初始值:
#include <array>
using std::array;
int main()
{
array<int, 5> arr1 = { 1, 2, 3, 4, 5 }; // arr1包含:1 2 3 4 5
array<int, 5> arr2 = { 0 }; // arr2包含:0 0 0 0 0
return 0;
}
如果 array 中包含的是基本类型,并且没有提供初始化值,则 array 中元素的值是未定义的:
array<int, 5> arr; // arr中元素的值是未定义的
赋值与交换
使用array的一个好处就是可以将一个相同类型的array对象赋值给另一个对象,array中的元素将会依次进行复制,因此,在赋值之后,两个array具有相同的元素,但需要保证两个array具有相同的元素类型以及大小。但对于一般数组,则不能这样做:
array<int, 5> arr1 = { 1, 2, 3, 4, 5 };
array<int, 5> arr2 = { 5, 4, 3, 2, 1 };
array<int, 5> arr3 = arr1; // arr3 包含:1 2 3 4 5
arr3 = arr2; // arr3 包含:5 4 3 2 1
注意,仅能将一个相同类型的array赋值给另一个array,但不能使用初始化列表来赋值array对象:
array<int, 5> arr1 = { 1, 2, 3, 4, 5 };
// ERROR: arr1 = { 1, 2, 3 }; 不能使用初始化列表来向array赋值
可以使用array的成员函数fill()来将array中的元素赋为相同的值:
array<int, 5> arr;
arr.fill( 9 ); // arr包含: 9 9 9 9 9
对于其它的序列容器,比如vector,可以使用swap()来交换两个vector,此时,使用swap()具有常量时间复杂度,显得特别高效,这是因为vector中拥有指向动态分配内存的指针,因此,使用swap()交换两个vector仅需要交换其内部指向动态内存的指针即可。同样,可以使用swap()来交换两个array,但由于array在栈上为元素分配内存,array内部并没有包含指向动态内存的指针,因此,使用swap()来交换两个array具有线性时间复杂度,因为交换两个array将会涉及到元素的逐一复制。swap有两种等价的形式,一种作为泛型的算法,另一种则作为array的成员函数:
array<int, 5> arr1 = { 1, 2, 3, 4, 5 };
array<int, 5> arr2 = { 5, 4, 3, 2, 1 };
swap( arr1, arr2 );
arr1.swap( arr2 ); // 等价于: swap( arr1, arr2 );
历遍array
array中具有成员函数size()用来获得array中元素的数目:
array<int, 5> arr = { 1, 2, 3, 4, 5 };
for ( int i = 0; i != arr.size() ; ++i )
{
cout << arr[i] << " ";
}
cout << endl;
array是序列容器的一种,可以使用迭代器的方式来历遍array,也可以使用for-each循环来历遍array:
array<int, 5> arr = { 1, 2, 3, 4, 5 };
for( auto elem : arr )
cout << elem << " ";
cout << endl;
for( auto iter = arr.begin(); iter != arr.end(); ++iter )
cout << *iter << " ";
cout << endl;
其他函数
std::array<int, 4> arr = {1, 2, 3, 4};
arr.empty(); // 检查容器是否为空
arr.size(); // 返回容纳的元素数
=======================
版权声明:本文为码到城攻博主「夏至未至」的原创文章,遵循CC BY-NC-ND 4.0版权协议,转载请附上原文出处链接及本声明。
原文链接:https://www.codecomeon.com/posts/221/