C++ vector 性能优化:

  • 若提前知道空间大小,提前分配会提高性能:
vector v;
v.reserve(10000);
// 注,reserve预留空间,但不创建对象
// 即在push_back或insert前不可以直接引用。
// 区别于resize(),resize()会创建对象。
for(int i = 0; i < 10000; i++){
	v.push_back(i);
}

在Scott Meyers的书中给出了解释:
对于vector和string,在需要更多空间时,会做与realloc等效的事情,步骤如下:
1,分配一个新内存块,其容量时当前容量的数倍。多数实现中,vector和string容量提升因子在1.5至2之间。
2,将原内存中数据拷贝至新内存(很费时间)。
3,释放原有内存对象。
4,释放原有内存。

  • 彻底释放vector内存时,使用swap(),而不是clear()或erase():
vector v;
v.push_back(1);
size_t c = v.capacity();
printf("%lu\n",c);
//
vector().swap(v); 
//
size_t d = v.capacity();
printf("%lu\n",d);

erase()或clear()不会减少vector的内存。

  • vector填充时,赋值最快,insert()次之,push_back()最慢。
vector v1;
vector v2;
v2 = v1;
v2.insert(v2.end(),v1.begin(),v1.end());
  • 遍历vector时,下标最快。
vector v;
for(auto p = v.begin(); p != v.end(); p++);
for(vector p = v.begin(); p != v.end(); p++);
for(unsigned i = 0; i < v.size(); i++);
  • 避免在vector前部插入元素
vector v;
v.insert(v.begin(), 1);
list l;
l.push_front(1);

你可能感兴趣的:(C++ vector 性能优化:)