C++11数组了解

C++11引入的std::array是一个固定大小的容器,用于替代传统C风格数组。它提供了诸如size()、fill()和swap()等便捷操作。文章通过实例展示了如何初始化、赋值、交换、遍历array以及使用相关函数。强调了std::array与普通数组的区别,如在赋值和交换时的时间复杂度差异。
摘要由CSDN通过智能技术生成

原文链接

C++11数组(array)的使用 - 码到城攻使用 std::array 能够让代码变得更加 ‘‘现代化’’,而且封装了一些操作函 数,比如获取数组大小以及检查是否非空https://www.codecomeon.com/posts/221/

数组介绍


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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值