C++ STL容器 vector、arrar和内置数组的效率问题


1. 当数据量较⼩时,既可以使⽤vector(使⽤其push_back函数即可),也可以使⽤array或者内置数组,不过优先建议使⽤vector,其
次是array,最后才是内置数组;
2. 当数据量较⼤时,且不是全局变量或者静态变量时,此时由于array是在栈上分配空间,此时array不能⽤(因为栈空间有限,数据量太
⼤就会栈溢出)(⾄少最新VS2019编译器是这样的),只能⽤vector或在堆上分配空间的内置数组(当然如果array是⼀个全局变量或者
静态变量,那么它就是在全局静态区上,⽽不是在栈上了。更有甚者,如果array是类的成员,且此类的对象是new出来的,那么这个
array也会分配到堆上)。此时:优先使⽤vector,且尽量预先分配空间,⽽不是⽤push_back()来添加数据。 因为数据量⼤
时,push_back会很慢,如果预先知道数据量是多少,则在创建vector时就预先分配空间,然后存⼊数据时⽤下标来存⼊数据。使⽤
最新VS2019编译器测试,在Release下,使⽤预分配的vector存⼊⼤量数据的速度⽐使⽤在堆上分配的内置数组存⼊数据要快很
多;
3. 在极少数极特殊情况下,使⽤内置类型数组(不管是堆上的还是栈上的)进⾏数据运算,会⽐使⽤下标的vector要快很多。⽐如
int size =32768;
注意后⾯要释放内存
int* data =newint[size];// 
//std::vector<int> data(size);
for(int i =0; i < size;++i)
 data[i]=rand()%512;
longlong sum =0;
for(int i =0; i <1000;++i)// 1
{
for(int index =0; index < size;++index)
{
if(data[index]>256)
    sum += data[index];
}
}
上述代码如果使⽤vector,在下⾯的双循环(即代码1处)的计算,要⽐使⽤内置数组慢很多倍。不过,经过测试,这种情况发⽣的前提是第
⼀层循环的次数很多,此时两者才会有很⼤差异。如果第⼀层循环次数很少,即使第⼆层循环次数⾮常多(即元素数量⾮常⼤),那么这种情
况下使⽤vector或者使⽤内置数组,它们消耗的时间没有什么差异,⼏乎相等。
话说回来,即使遇到上⾯这样的代码,也可以使⽤vector,通过⼀些⼩把戏,来达到与内置数组⼀样快的速度:
int size =32768;
std::vector<int>data(size);
for(int i =0; i < size;++i)
 data[i]=rand()%512;
longlong sum =0;
直接获取内部数组地址
int* rawDataMem =&data[0];// 1 
for(int i =0; i <1000;++i)
{
for(int index =0; index < size;++index)
{
if(rawDataMem[index]>256)// 2
    sum += rawDataMem[index];// 3
}
}
如代码中1,2和3处所⽰,对于⼤⼩不变化的vector,其在内存中就是⼀个堆数组,所以我们可以在某些情况下绕过vector接⼝,⽽直接获
取其内部数组中的元素,这样的写法等价是使⽤内置数组类型,且上述代码的执⾏时间与使⽤内置数组类型的代码相同。使⽤这种⽅式不需
要主动管理内存,释放内存,很⽅便。
不过这种⽅式⼀般情况下不要使⽤,⼀般情况下直接⽤vector的接⼝并不⽐上述⽅法慢多少,且⼀旦vector中元素个数变化了,其指针就失
效了,有点危险。因此,只有在这种极少数情况下可以尝试性地使⽤。
综上所述,当数据量⼩时,尽量使⽤vector及其push_back()成员函数来添加数据;当数据量很⼤时,尽量使⽤vector且预先分配好⼤⼩,
添加数据时⽤下标添加。
 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值