1. resize 与 reserve
先看一个简单的例子:
//使用resize
std::vector<int> vec1;
vec1.resize(10);
vec1.push_back(10); // 第11个元素
vec1.push_back(10); // 第12个元素
// 使用reserve
std::vector<int> vec2;
vec2.reserve(10);
vec2.push_back(10); // 第1个元素
vec2.push_back(10); // 第1个元素
通过查看vector的源代码,就可以很容易地看到:
>> resize(10)使用10个默认初值(此处为0)的对象(int类型)去填充10个区域,这可以通过vec1.size()获得的vec1的大小验证,如果要改变这10个元素的值,可用直接使用vec1[0] = 10....
>> reserve(10)仅仅是预分配 10个int类型的空间,而不改变vector的大小(vec1.size() = 0)
2. swap 与 clear
从两个函数的名字就可以清楚地了解到:swap是用于交换两个容器的内容,clear是用于清空当前的容器。这里要说明的是,swap与clear都可以用以“清空”当前的容器(涉及到swap的巧妙用法)。不过两者对vector的底层影响并不一样。看看下面的代码:
// 使用clear
std::vector<int> vec1;
for (int i = 0; i < 10; ++i) {
vec1.push_back(10);
} // size = 10, capacity >= 10(13)
vec1.clear(); // size = 10, capacity不变
// 使用swap
std::vector<int> vec2;
for (int i = 0; i < 10; ++i) {
vec2.push_back(10);
} // size = 10, capacity >= 10(13)
vec2.swap(std::vector<int>()); // size = 0, capacity = 0
可以看出:clear仅仅清空vecotr中的数据,而不改变vector的实际物理空间大小。swap能够彻底改变vector的物理空间(这点往往很重要)。
3. 对象元素的一些说明
在vector中插入对象(class)要注意对象的构造与析构所引起的额外消耗,如:函数调用的系统消耗,函数本身的消耗等。即使一个空的构造/析构函数,对于数量非常庞大的函数调用的开销还是不能不考虑的。