标准模板库(STL)之 vector 列传

1. erase() 成员函数的两个重载

  • c.erase(pos):移除 iterator 位置 pos 上的元素,返回下一个元素的位置;

  • c.erase(beg, end):移除 [beg, end) 区间内的所有元素,返回下一个元素的位置;

2. resize()

std::vector<int> v;
v.resize(3);
                        // v[0] = 0
                        // v[1] = 0
                        // v[2] = 0

3. 大小(size)和容量(capacity)

注意区分这两个概念,因为这两个是差异非常大的概念,两者对 vector 的效率也有着至关重要的影响。(两者返回的是元素数量,而非容器所占字节数

使 vector 达到优异效率的秘诀之一,就是分配出“较其容纳的元素”更多的内存。为了高效地运用 vector,你应该了解大小(size)和容量(capacity)之间的关系和区别。

vector 提供的用以操作大小的函数有 size()empty()max_size()(32位机器v.max_size()的大小一般为1073741823, 2301 )。另一个与大小有关的函数是 capacity(),返回 vector 实际能够容纳的元素量。如果超过这个数量,vector 就有必要重新分配内存。

vector 的容量之所以如此重要(也即内存重新分配的弊端),有两个原因:

  1. 一旦内存重新分配,vector 元素相关的所有 reference、pointer、iterator都会失效

  2. 内存重新分配十分耗时。

故,如果你的程序管理了“与vector元素相关”的reference、pointer 或 iterator,或如果程序的执行速度对你而言至关重要,那就必须考虑容量问题。

两种避免重新分配内存的方法

  • 我们可以使用 reverse() 保留适当容量,避免重新分配内存。如此以来,只要保留的容量尚有富余,就不必担心 reference 失效。

    std::vector<int> v;
    v.reserve(80);
    std::cout << v.size() << std::endl;
                    // 0
    std::cout << v.capacity() << std::endl;
                    // 80
    std::cout << v.max_size() << std::endl;
                    // 1073741823
  • 初始化期间就像构造函数传递额外实参,构造足够的空间。如果你的实参是个数值,它将成为 vector的起始大小。

    std::vector<T> v(3);
            // creates a vector and initializes it with five values
            // (calls five times the default constructor of type T)
    class Dog
    {
    public:
        Dog() { std::cout << "wang ! wang  wang !!" << std::endl; } 
    };
    
    int main(int, char**)
    {
        std::vector<Dog> ds(3);
                    // wang ! wang wang!!
                    // wang ! wang wang!!
                    // wang ! wang wang!!
        std::cout << ds.size() << std::endl;
                    // 3
        return 0;
    }

    欲获得这种能力,元素类型必须提供一个 default 构造函数。对基础类型而言,唯一能保证的是 zero initialization。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五道口纳什

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值