​ 记录几个 vecotor 易混淆的几个API用法。

reserveresize

  • reserve增加了vectorcapacity,但是它的size没有改变。reserve是容器预留空间,但在空间内不真正创建元素对象,所以在没有添加新的对象之前,不能引用容器内的元素。加入新的元素时,要调用push_back()/insert()函数。
  • resize改变了vectorcapacity同时也增加了它的sizeresize是改变容器的大小,且在创建对象,因此,调用这个函数之后,就可以引用容器内的对象了,因此当加入新的元素时,用operator[]操作符,或者用迭代器来引用元素对象。此时再调用push_back()函数,是加在这个新的空间后面的。
  • 如果reserve(n)函数的n的大小比vector原来的容量小。capacity没有变化。size也没有变:
  • 如果resize(n)函数的nvector原来的size小,结果是size减小到n,然后删除n之后的数据。
vector<int> myVec;
myVec.reserve(100);     // 新元素还没有构造,
                        // 此时不能用[]访问元素
for (int i = 0; i < 100; i++)
{
     myVec.push_back(i); //新元素这时才构造
}
myVec.resize(102);      // 用元素的默认构造函数构造了两个新的元素
myVec[100] = 1;         // 直接操作新元素
myVec[101] = 2; 

clear

  • clear 函数不会释放内存,即改变 capacity,只会将size改为0

  • swap来帮助释放内存

    vector<int> nums; 
    nums.push_back(1);
    nums.push_back(1);
    nums.push_back(2);
    nums.push_back(2); 
    vector<int>().swap(nums); //或者 nums.swap(vector<int>())
    

emplace_backpush_back

  • emplace_back可以原地构造对象,然后加入到容器中,可以减少一次拷贝或构造
  • push_back向容器中加入一个右值元素(临时对象)的时候,首先会调用构造函数构造这个临时对象,然后优先选择调用移动构造函数,如果没有才会调用拷贝构造函数临时对象放入容器中。原来的临时变量释放。这样造成的问题是临时变量申请的资源就浪费。
  • emplace_back函数要比push_back函数要快一倍

参考链接