std::array
参考
- c++11标准特性
- IDE:vs 2022
定义
- 定义时必须指定大小,且不能使用变量指定
- 可以通过arry构造新的array,{}也合法
- 不可以使用数组构造,即arry = ch是不合法的操作
- 本质上任然是一个固定大小的数组,不能删除或者添加元素。
注意
如果使用了using namespace std,则后续代码可以无视std::
前期先保持基础写法。
前言
在c语言和c++中,传统方式上定义一个数组可以用:
1 | int ch[10] = {0}; |
两者区别不大,前者由系统自动分配到栈区,后者在堆区上开辟空间并用指针指向它。
正文
使用array前,需引用头文件
1 | std::array<int, 2> ary = { 0,1 }; |
size()
array内置size()方法,可以直接返回array数组有几个成员。
传统上我们需要知道数组的成员个数需要通过sizeof(数组)/sizeof(数组类型或者数组首成员[0])
。
fill()
可以说是一个初始化方法,根据括号内的值,将array数组所有成员都设置为括号内的值。
当然跟传统上的方法感觉差别不大。
at()
具有传统意义上索引作用,传统数组使用数组[0]来获取内容,而array数组则根据at(0)来返回,当然不是说arry数组就不能使用[]了,而是多了at()方法。
如果产生越界行为,如arry<int,2> arr,而你去访问arr.at(100),程序即产生错误抛出异常:
传统定义的数组去访问越界时就有可能得到不正确的值,可以说是一种不安全的行为:
==重载
可以看到有意思的是,arrary数组相比较能返回真,而相同的int数组则返回假,当然底层离不开符号重载的实现。重载后面再说,我们可以浅看一下反汇编代码:
先打个断点:
然后转到反汇编:
首先就是array的反汇编代码比正常数组的代码少。
然后ch和ch1有一个cmp比较过程,但随后的jne好像是不等于就转移,然后后面就是一堆跟地址一样的操作
汇编还没系统性学习,看个大概
ary和ary2在call的时候有一个operator==,这是符号重载的写法,也就是说这里肯定离不开重载,至于后面的目前也不是很清楚
结语
内置的方法还有几个,涉及到容器的方面,等后面再补充吧。
封装好的东西固然功能多,在各方面会更完善,但也就意味着资源消耗的也多了。不过使用的前提还是看使用者,有这么个好东西知道就行。