《STL源码剖析》chapter4 序列式容器之array,forward_list

序列式容器array

array概述

array只是对c++原本的静态数组进行了泛化封装,其定义如下:

    template<class T,std::size_t N>
    struct array{
        typedef T                 value_type;
        typedef T*                pointer;
        typedef value_type*       iterator;
        typedef const value_type* const_iterator;
        typedef size_t            size_type;
        typedef T&                reference;

        //内部数据
        value_type _M_instance[N?N:1];

        iterator begin() { return iterator(&_M_instance[0]); }
        const_iterator cbegin() const { return iterator(&_M_instance[0]); }
        iterator end() { return iterator(&_M_instance[N]); }
        const_iterator cend() const { return iterator(&_M_instance[N]); }

        //capacity
        size_type size() const { return N; }
        size_type max_size() const { return N; }
        bool empty() const { return size()==0; }

        //element access
        reference operator[](size_type n) { return _M_instance[n]; }
        reference at(size_type n) {
            if(n<0||n>=N){
                //这里只是将异常抛出
                throw;
            }
            return _M_instance[n];
        }
        reference front() { return _M_instance[0]; }
        reference back() { return _M_instance[N-1]; }
    };

从上述代码可以看出STLarray根据第二模板参数推断出数组的大小,同时由于其和vectro一样数据存储在连续线性内存上,所以使用普通的指针即可作为其迭代器。

同时为了与内置的数组保持一致,STL中提供的array不提供构造函数和析构函数。

在实际使用array时,代码编写如下:

array<int,10> myarray;
for(int i=0;i<10;++i)
    myarray[i]=i

序列式容器forward_list(GC2.9中是slist)

forward_list概述

forward_listlist的主要差别在于,前者的迭代器属于单向的ForwardIterator,后者的迭代器属于双向的BidirectionalIterator。相比于list,forward_list所耗用的空间更小,某些操作更快。

基于效率的考虑,forward_list不提供push_back,只提供push_front(),因此slist的元素次序会和元素插入进来的次序相反。

slist的节点和迭代器

slist采用下图所示的继承关系设计了节点和迭代器

在这里插入图片描述

最后

本节中涉及的代码及本人实现的toy级别的array可以参考github及forward_lsit可以参考github

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值