array 容器是 C++ 11 标准中新增的序列容器,简朴地明白,它就是在 C++ 平凡数组的根本上,添加了一些成员函数和全局函数。
之前我在思考,STL为什么要多出这个容器呢?直接用数组它不香吗??它不快吗?非要搞出这么个玩意。厥后我想明白了,我以为它就是想要使用STL内里的算法。
先把它用起来吧。
首先需要引用:
array也就是数组嘛,所以它和我们常用的数组一样好比:int a[10],它表现10个整型的元素;array 容器和数组一样,它的巨细也是固定的,无法动态的扩展或收缩。
std::array a;这个和int a[10];一样。
但是std::array a;和int a[10];一样,都没有默认初始化。
这代表默认初始化为0.
如下测试:
默认初始化为0.
再看别的的测试:
从效果可以看出和数组特性一模一样。
现在看看随机访问:
此中我比力喜欢的一个数可以直接拿出它的个数,不想数组一样sizeof(a)/sizeof(a[0]),ZTM贫苦,如下
下面是一些乐成函数:
成员函数功能begin()返回指向容器中第一个元素的随机访问迭代器。end()返回指向容器最后一个元素之后一个位置的随机访问迭代器,通常和 begin() 联合使用。rbegin()返回指向最后一个元素的随机访问迭代器。rend()返回指向第一个元素之前一个位置的随机访问迭代器。cbegin()和 begin() 功能相同,只不外在其根本上增加了 const 属性,不能用于修改元素。cend()和 end() 功能相同,只不外在其根本上,增加了 const 属性,不能用于修改元素。crbegin()和 rbegin() 功能相同,只不外在其根本上,增加了 const 属性,不能用于修改元素。crend()和 rend() 功能相同,只不外在其根本上,增加了 const 属性,不能用于修改元素。size()返回容器中当前元素的数量,其值始终便是初始化 array 类的第二个模板参数 N。max_size()返回容器可容纳元素的最大数量,其值始终便是初始化 array 类的第二个模板参数 N。empty()判断容器是否为空,和通过 size()==0 的判断条件功能相同,但其效率大概更快。at(n)返回容器中 n 位置处元素的引用,该函数自动查抄 n 是否在有效的范围内,如果不是则抛出 out_of_range 异常。front()返回容器中第一个元素的直接引用,该函数不适用于空的 array 容器。back()返回容器中最后一个元素的直策应用,该函数同样不适用于空的 array 容器。data()返回一个指向容器首个元素的指针。使用该指针,可实现复制容器中所有元素等类似功能。fill(val)将 val 这个值赋值给容器中的每个元素。array1.swap(array2)交换 array1 和 array2 容器中的所有元素,但前提是它们具有相同的长度和范例。上面是一些常用的函数。使用方法也有说明。
接下来看看源码:
这个源码是我VS2013下的,在c盘就有,自己可以拿来学习。
详细路径为:C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\array
我直接将表明写在背面吧
注意源码背面我有部分源代码表明。
[code]template//表明几个元素 class array { // fixed size array of valuespublic: enum {_EEN_SIZE = _Size}; // helper for expression evaluator typedef array _Myt; typedef _Ty value_type; typedef size_t size_type; typedef ptrdiff_t difference_type; typedef _Ty *pointer; typedef const _Ty *const_pointer; typedef _Ty& reference; typedef const _Ty& const_reference; typedef _Array_iterator iterator; typedef _Array_const_iterator const_iterator; typedef _STD reverse_iterator reverse_iterator; typedef _STD reverse_iterator const_reverse_iterator; void assign(const _Ty& _Value) { // assign value to all elements _Fill_n(_Elems, _Size, _Value); } void fill(const _Ty& _Value) { // assign value to all elements _Fill_n(_Elems, _Size, _Value); } void swap(_Myt& _Other) _NOEXCEPT_OP(_NOEXCEPT_OP(_Swap_adl(_Elems[0], _Elems[0]))) { // swap contents with _Other _Swap_ranges(_STD addressof(_Elems[0]), _STD addressof(_Elems[0]) + _Size, _STD addressof(_Other._Elems[0])); } iterator begin() _NOEXCEPT { // return iterator for beginning of mutable sequence return (iterator(_STD addressof(_Elems[0]), 0)); } const_iterator begin() const _NOEXCEPT { // return iterator for beginning of nonmutable sequence return (const_iterator(_STD addressof(_Elems[0]), 0)); } iterator end() _NOEXCEPT { // return iterator for end of mutable sequence return (iterator(_STD addressof(_Elems[0]), _Size)); } const_iterator end() const _NOEXCEPT { // return iterator for beginning of nonmutable sequence return (const_iterator(_STD addressof(_Elems[0]), _Size)); } reverse_iterator rbegin() _NOEXCEPT { // return iterator for beginning of reversed mutable sequence return (reverse_iterator(end())); } const_reverse_iterator rbegin() const _NOEXCEPT { // return iterator for beginning of reversed nonmutable sequence return (const_reverse_iterator(end())); } reverse_iterator rend() _NOEXCEPT { // return iterator for end of reversed mutable sequence return (reverse_iterator(begin())); } const_reverse_iterator rend() const _NOEXCEPT { // return iterator for end of reversed nonmutable sequence return (const_reverse_iterator(begin())); } const_iterator cbegin() const _NOEXCEPT { // return iterator for beginning of nonmutable sequence return (((const _Myt *)this)->begin()); } const_iterator cend() const _NOEXCEPT { // return iterator for end of nonmutable sequence return (((const _Myt *)this)->end()); } const_reverse_iterator crbegin() const _NOEXCEPT { // return iterator for beginning of reversed nonmutable sequence return (((const _Myt *)this)->rbegin()); } const_reverse_iterator crend() const _NOEXCEPT { // return iterator for end of reversed nonmutable sequence return (((const _Myt *)this)->rend()); } size_type size() const _NOEXCEPT { // return length of sequence return (_Size); } size_type max_size() const _NOEXCEPT { // return maximum possible length of sequence return (_Size); } bool empty() const _NOEXCEPT { // test if sequence is empty return (_Size == 0); } reference at(size_type _Pos) { // subscript mutable sequence with checking if (_Size |