Effective STL学习_vector string

  1. 使用reserve来避免不必要的重新分配
	对于vector和string,增长过程类似于realloc
	1.分配一块大小为当前容量的某个倍数的内存
	2.把旧容器的元素从旧的内存复制到新的内存中
	3.析构掉旧内存中的对象
	4.释放旧内存
	
	以上动作比较耗时,且以前的迭起器,指针,引用都会失效
	reserve(n)是强迫容器把它的容量变为至少n,即假如对容器的未来扩容时,使用其,便不会重新分配
  1. 注意string实现的多样性。
	 引用技术方式和指针char等,例如腾讯还专门重写了string
	 同理使用任何库的时候,不要对其安全性抱有幻想,要看过源码,才去使用,否则使用时出错,就是自己的问题
  1. 使用swap 出去多余的容量
  如果内存不再需要,压缩至当前需要的容量
  vector<int> vec;
  ......
  vector<int>(vec).swap(vec);

  vector<int>(vec)创建了一个临时的变量,是原先vec的副本,调用复制构造函数,
  然后将临时vec的数据和原先的vec做swap操作,在这之后临时变量则需要被析构。
  但这不意味着将容量降至最小,而是在当前的大小确定的情况下使容量变为最小
  swap可以做清除容器使用
  vector<int> v;
  ......
  vector<int>().swap(v)
  1. 避免使用vector
vector<bool> v;
bool *pb = &v[0];//error
看起来是存储了,实际是假存储,储存的bool是紧凑表示,每个bool仅占一个二进制位,即位域bitfield
替代方法:deque<bool> or bitset
posted @ 2021-10-30 15:15  Kiris  阅读(34)  评论(0)    收藏  举报