STL:序列式容器vector总结

本文介绍了C++ STL中的vector容器,对比了vector与数组的区别,强调了vector的灵活性和自动扩容特性。内容包括vector的基本操作如插入、删除元素,以及内部扩容机制的详细解释,探讨了为什么vector主要提供尾插和尾删操作以优化效率。
摘要由CSDN通过智能技术生成

说起数组我们都不陌生,但在C++中,除了数组还多了一个“新朋友”那就是vector。其实vector本质上与array的数据安排以及操作方式也其为相似。它俩唯一的差别就是空间灵活性。

无论在C语言还是C++中,array的空间一旦申请完成就不能进行更改,如果需要更大空间来存储数据,便得重新申请一个新的数组并将原来的数值拷贝过去,然后再将原来数组释放,而这一切都需要用户自己完成。而vector不同的是,它的空间分配更加灵活,当他内存不够存放时,它内部机制会自行进行容量扩充,这对于程序员来说使用起来更加灵活和方便。
vector结构图:
这里写图片描述

下面我们一起来看看STL中是如何示现vector的。

template <class T, class Alloc = alloc>  //定义为模版类,配置空间默认使用alloc。
class vector
{
public:  //将类型重命名使用起来更加方便、易懂
    typedef T           value_type;
    typedef value_type* pointer;
    typedef value_type& reference;
    typedef value_type* iterator;
    typedef size_t      size_type;
    typedef ptrdiff_t   difference_type;
protected:
    //填充并初始化
    void fill_initialize(size_type n, const T &value)
    {
        start = allocate_and_fill(n,value); //构造并填充
        finish = start+n;                   //调整finish指向最后一个元素的下一个空间
        end_of_storage = finish;            //让end_of_storage指向目前可以使用空间的尾部
    }

    //构造空间并且填满初始值
    iterator allocate_and_fill(size_type n, const T &x)
    {
        iterator result = data_allocator::allocate(n); //配置n个空间,此时allocate()实质上是使用的时空间配置器中的simple_alloc()函数
        uninitialized_fill_n(result,n,x);  //用x将n个空间填满
        return result;                     //返回vector的首地址
    }
public:
    //用初始值构造一个vector
    vector():start(0),finish(0),end_of_storage(0){}
    //构造一个可存放n个元素的vector,初始值用默认值填充
    vector(size_type n)
    {
        fill_initialize(n,T());
    }
    ~vector()
    {}
private:
    typedef simple_alloc<value_type, Alloc> data_allocator;   //将simple_alloc<value_type, Alloc>重命名
    iterator start;            //指向目前使用空间的头
    iterator finish;           //指向目前使用空间的尾
    iterator end_of_storage;   /
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值