请选择 进入手机版 | 继续访问电脑版

STL-02-array使用及其源码剖析

[复制链接]
谢世民 发表于 2021-1-2 19:44:53 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
array 容器是 C++ 11 标准中新增的序列容器,简朴地明白,它就是在 C++ 平凡数组的根本上,添加了一些成员函数和全局函数。
之前我在思考,STL为什么要多出这个容器呢?直接用数组它不香吗??它不快吗?非要搞出这么个玩意。厥后我想明白了,我以为它就是想要使用STL内里的算法。
先把它用起来吧。
首先需要引用:
  1. #include
复制代码
array也就是数组嘛,所以它和我们常用的数组一样好比:int a[10],它表现10个整型的元素;array 容器和数组一样,它的巨细也是固定的,无法动态的扩展或收缩。
std::array a;这个和int a[10];一样。
但是std::array a;和int a[10];一样,都没有默认初始化。
  1. std::array a{};
复制代码
这代表默认初始化为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
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

发布主题

专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )