记录几个 vecotor 易混淆的几个API用法。
reserve 和 resize
reserve增加了vector的capacity,但是它的size没有改变。reserve是容器预留空间,但在空间内不真正创建元素对象,所以在没有添加新的对象之前,不能引用容器内的元素。加入新的元素时,要调用push_back()/insert()函数。resize改变了vector的capacity同时也增加了它的size。resize是改变容器的大小,且在创建对象,因此,调用这个函数之后,就可以引用容器内的对象了,因此当加入新的元素时,用operator[]操作符,或者用迭代器来引用元素对象。此时再调用push_back()函数,是加在这个新的空间后面的。- 如果
reserve(n)函数的n的大小比vector原来的容量小。capacity没有变化。size也没有变: - 如果
resize(n)函数的n比vector原来的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_back 和 push_back
emplace_back可以原地构造对象,然后加入到容器中,可以减少一次拷贝或构造push_back向容器中加入一个右值元素(临时对象)的时候,首先会调用构造函数构造这个临时对象,然后优先选择调用移动构造函数,如果没有才会调用拷贝构造函数临时对象放入容器中。原来的临时变量释放。这样造成的问题是临时变量申请的资源就浪费。emplace_back函数要比push_back函数要快一倍