记录几个 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
函数要快一倍