- 使用reserve来避免不必要的重新分配
对于vector和string,增长过程类似于realloc
1.分配一块大小为当前容量的某个倍数的内存
2.把旧容器的元素从旧的内存复制到新的内存中
3.析构掉旧内存中的对象
4.释放旧内存
以上动作比较耗时,且以前的迭起器,指针,引用都会失效
reserve(n)是强迫容器把它的容量变为至少n,即假如对容器的未来扩容时,使用其,便不会重新分配
- 注意string实现的多样性。
引用技术方式和指针char等,例如腾讯还专门重写了string
同理使用任何库的时候,不要对其安全性抱有幻想,要看过源码,才去使用,否则使用时出错,就是自己的问题
- 使用swap 出去多余的容量
如果内存不再需要,压缩至当前需要的容量
vector<int> vec;
......
vector<int>(vec).swap(vec);
vector<int>(vec)创建了一个临时的变量,是原先vec的副本,调用复制构造函数,
然后将临时vec的数据和原先的vec做swap操作,在这之后临时变量则需要被析构。
但这不意味着将容量降至最小,而是在当前的大小确定的情况下使容量变为最小
swap可以做清除容器使用
vector<int> v;
......
vector<int>().swap(v)
- 避免使用vector
vector<bool> v;
bool *pb = &v[0];
看起来是存储了,实际是假存储,储存的bool是紧凑表示,每个bool仅占一个二进制位,即位域bitfield
替代方法:deque<bool> or bitset