STL学习笔记-vector、string内建方法【待更新】
size()告诉你获得该容器中有多少个元素。它不会告诉你该容器为自己锁包含的元素分配了多少内存。
capcity()告诉你该容器利用已经分配的内存可以容纳多少元素。这是容器所能容纳容器的总数,而不是它还能容纳多少个元素。如果你想知道一个vector有多少未被使用的内存,你就得从capcity()中减去size()。如果size和capcity返回同样的值,就说明容器中不再有剩余控件了,因此下一个插入操作(通过insert或push_back等)将导致重新分配。
resize(Container::size_type n)强迫容器改变到包含n个号元素的状态。在调用resize之后,size将返回n。如果n比当前的大小(size)要小,则容器尾部的元素将会被析构。如果n比当前的大小要达,则通过默认构造函数创建的新元素将被添加到容器的末尾。如果n比当前的容量要大,那么在添加元素之前,将先重新分配内存。
reserve(Container::size_type n)强迫容器把它的容量变为至少是n,前提是n不小于当前的大小。这通常回导致重新分配,因为容量需要增加。(如果n比当前的容量小,则vector忽略该调用,什么也不做;而string则可能把自己的容量减为size()和n中的最大值,但是string的大小肯定保持不变。[使用reserve从string中出去多余的容量不如使用“swap”])
swap技巧:除去多余的容量(shrink-to-fit)
vector<Container> c;
......
vector<Container>(c).swap(c);
表达式vector<Container>(c)创建一个临时的矢量他是c的一个:这是由vector的拷贝构造函数来完成的。然而,vector的拷贝构造函数只为所拷贝的元素分配所需要的内存,所以这个临时矢量没有多余的容量。然后我们把临时矢量中的数据和c中的数据做swap操作,在这时候,c具有了被除去之后的容量,即原先临时变量的容量,而临时变量的容量则变成了原先的c臃肿的容量。到这是(在语句结尾),临时矢量被析构,从而释放了先前为c所占据的内存。
#include <iostream>
#include <vector>
#include <string>
using namespace std;
#define PRINT(X) cout << #X ":" << (X) << endl
int main()
{
vector<int> vecI;
vecI.reserve(100);
PRINT(vecI.capacity());//vecI.capacity():100
PRINT(vecI.size());//vecI.size():0
for(int index = 0; index < 10; ++ index)
{
vecI.push_back(index);
}
cout << "after push_back" << endl;
PRINT(vecI.capacity());//vecI.capacity():100
PRINT(vecI.size());//vecI.size():10
vector<int>(vecI).swap(vecI);
cout << "after swap" << endl;
PRINT(vecI.capacity());//vecI.capacity():10
PRINT(vecI.size());//vecI.size():10
return 0;
}
浙公网安备 33010602011771号