栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++11: 尽量使用std::array来代替数组

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++11: 尽量使用std::array来代替数组

std::array是具有固定大小的数组,使用栈(静态内存分配)。支持快速随机访问,效率与数组相同。不能添加或删除元素。

需要包含头的头文件文件 #include

  • 定义时必须指定array的大小,因为大小是模板参数之一,不可忽略;
  • 定义时不能使用变量指定大小;
  • 可通过array构造新的array,可以使用{}构造;
  • 不可使用数组构造。

array myarray = {1,2,3,4,5};
array otherarray = myarray;
int b[5];
array otherarray2 = b;  //编译报错,error: no viable conversion from 'int [5]' to 'array
int init_size=5;
array otherarray3;  //编译报错,error: non-type template argument is not a constant expression
int d[init_size];  //普通数组是可以支持用变量初始化大小

可通过下标运算符[]对元素进行操作,还可以通过at/front/back进行操作。

note: 尽量使用at方法来访问元素,因为运算符[]不会对索引值进行检查,像myarray[-1]是不会报错的。使用at(),将在运行期间捕获非法索引的,而程序默认将中断。当然额外检查将导致程序运行时间更长。

降低意外越界错误的概率,包含成员函数begin()和end(),可以通过正向和反向迭代器对元素进行遍历。

C++11后,标准库引入了更现代化的数组std::array,cppreference.com是这样介绍的:

定义于头文件
template<
class T,
std::size_t N
> struct array;
(C++11 起)

std::array 是封装固定大小数组的容器。


此容器是一个聚合类型,其语义等同于保有一个 C 风格数组 T[N] 作为其唯一非静态数据成员的结构体。
不同于 C 风格数组,它不会自动退化成 T* 。
作为聚合类型,它能聚合初始化,只要有至多 N 个能转换成 T 的初始化器: std::array a = {1,2,3};
该结构体结合了 C 风格数组的性能和可访问性和容器的优点,譬如知晓其大小、支持赋值、随机访问等。
std::array 满足容器 (Container) 和可逆容器 (ReversibleContainer) 的要求,除了默认构造的 array 是非空的,及交换的复杂度是线性,它满足相接容器 (ContiguousContainer) 的要求并 (C++17 起)部分满足顺序容器 (SequenceContainer) 的要求。

一种特殊情况是 array ( N == 0 )。该情况下, array.begin() == array.end() ,并拥有某个唯一值。在零长 array 上调用 front() 或 back() 的效应是未定义的。

array 亦可用作拥有 N 个同类型元素的元组。

简单来说,std::array除了有传统数组支持随机访问、效率高、存储大小固定等特点外,还支持迭代器访问(从而直接应用算法)、获取容量、获得原始指针等高级功能。这是容器化带来的好处,而且它还不会退化成指针T *给开发人员造成困惑。

用std::array后,可以更简便地进行初始化、修改、遍历,举个栗子:

//use {} to initialize
std::array arr = {1,2,3,4,5,6,7,8,9,0};

//use function void fill(const _Ty& _Value); to initialize an array
arr.fill(0);

//Traverse all items in array
for (auto iterator = arr.begin(); iterator != arr.end();++iterator ) {
    std::cout << *iterator << std::endl;    //using iterator

for (auto item : arr) {
    std::cout << item << std::endl;
}
std::for_each(arr.begin(), arr.end(), [](int& item) {std::cout << item << std::endl; });

// alter item of array
std::for_each(arr.begin(), arr.end(), [](int& item) {item++; });

std::array arr2 = {1,2,3,4,5,6,7,8,9,0};
arr2.swap(arr); // swap, arr2 and arr shall be the same size

 

ref

std::array源码分析
C++11 标准库源代码剖析:连载之三 - 简书

STL:array/vector/list比较

Function

array

vector

list

constructornoyesyes
destructornoyesyes
empty()yesyesyes
size()yesyesyes
resize()noyesyes
capacity()noyesno
reserve()noyesno
max_size()yesyesyes
erase()noyesyes
clear()noyesyes
operator=yesyesyes
operator<yesyesyes
operator==yesyesyes
operator[]yesyesno
at()yesyesno
front()yesyesyes
back()yesyesyes
ush_back()noyesyes
pop_back()noyesyes
assign()yesyesyes
insert()noyesyes
swap()yesyesyes
push_front()nonoyes
pop_front()nonoyes
merge()nonoyes
remove()nonoyes
remove_if()nonoyes
reverse()nonoyes
sort()nonoyes
splice()nonoyes
unique()nonoyes

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/512581.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号