[Effective STL] Vector和String

使用reserve来避免不必要的重新分配

关于STL容器,最了不起的一点是,它们是自动增长以便容纳下你放入其中的数据,只要没有超出它们的最大限制就可以。
对于vector和string,增长过程是这样的:每当需要更多空间时,就调用与realloc类似的操作。
1、分配一块大小为当前容量的某个倍数的新内存。在大多数实现中,vector和string的容量每次以2的倍数增长,即,每当容器需要扩张时,它们的容量即加倍。
2、把容器中所有元素从就内存拷贝到新内存。
3、析构掉旧内存中的对象。
4、释放旧内存。

为了避免上述重新分配过程,通过reserve实现
1、若能确切知道或大致预计容器中的最终会有多少元素,则此时可使用reserve,可以预留适当大小空间。
2、先预留足够大的空间,然后把所有的数据都加入以后,再删除多余的容量。

把vector和string数据传给旧的API的方法

1、对于

  vector<int> v;

可以用&v[0]来表示int指针,但要注意当vector为空的时候,&v[0]表示int指针对指向东西不存在。
2、对于string,可以用string.c_str()获得字符串指针,但要注意这个字符串指针所指向的是string数据不可拷贝的对象。

如果想把C API中的数据写入STL容器,可以先将数据写入vector,然后把数据拷贝到期望最终写入STL容器中:

size_t fillarray(double *pArray,size_t arraysize);
vector<double> vd(maxNumDoubles);
vd.resize(fillarray(&vd[0],vd.size()));

deque<double> d(vd.begin(),vd.end());
list<double> l(vd.begin(),vd.end());
set<double> s(vd.begin(),vd.end());

同理除了vector和string以外的其他STL容器也能把它们的数据传递给C API。你只需要把每个容器的元素拷贝到一个vector中,然后传给该API:

void dosomething(const int* pInts,size_t numInts);
set<int> intSet;
...
vector<int> v(intSet.begin(),intSet.end());
if(!v.empty()) doSomething(&v[0],v.size());

使用"swap技巧"除去多余的容量

为了避免矢量仍占用不再需要的内存,你希望有一种方法能把它的容量从以前的最大值缩减到当前需要的数量。这种对容量的缩减通常被称为“shrink to fit”(压缩至适当大小)。

class Contestant{...};
vector<Contestant> contestant;

vector<Contestant> (contestant).swap(contestant);

表达式vector (contestant)创建了一个临时的矢量,它是contestant的拷贝:这是由vector的拷贝构造函数来完成的。然而,vector的拷贝构造函数只为所拷贝的元素分配所需的内存,所以这个临时变量没有多余的容量。

避免使用vector

Note:
1、vector不是容器
2、vector它并不存储bool

你可能感兴趣的:(C++)