C++ vector 性能优化:

  • 若提前知道空间大小,提前分配会提高性能:
vector<int> 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<int> v;
v.push_back(1);
size_t c = v.capacity();
printf("%lu\n",c);
//
vector<int>().swap(v); 
//
size_t d = v.capacity();
printf("%lu\n",d);

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值