c++中优化:范围for循环,提高运行速度的方法

for循环的访问一般有两种方式:

1 下标访问

2 迭代器访问

使用迭代器访问需要注意的问题:

结论:

在范围for循环语句中,使用迭代器访问时,不能在循环体内部对容器(如vector)的元素进行添加或删除

原因:

因为在范围for循环语句中,预存了end()的值,一旦在容器序列中添加或删除元素,end()函数的值就很可能变得无效了。

vector插入或删除元素的原理:

创建vector时,内存会按一定规则(这点以后具体展开说)预先开辟出一块大于等于实际存储容量的空间,供后续的插入和删除操作使用(大于的原因是避免改变容量时,频繁的开辟新的内存)。如果插入或删除后的vector内存大于或者小于预订规则的空间时,计算机就会重新为该vector变量重新开辟一块内存,并依据规则相应地扩大或缩小。

所以,当我们对vector进行增加或删除时,for循环预存的end()函数的值就可能会失效,即指向一个无效的空间。

当然也有一种可能:往vector中增加一个元素,增加后的内存大小没有达到重新开辟空间的要求。此时for循环预存的end()函数还是存在一个有效值的,但指向的已经不是末尾元素了。但是很多编译器为了避免可能的失效风险,对此类情况也做报错。

关于访问速度

对于:

下标访问/迭代器/c++11新标准的迭代器

3种方式进行了测试:

1
for(int i=v.size()-1;i>=0;i--)
        v[i]+1;

2
for(auto iter=v.begin();iter!=v.end();iter++)
        *iter+1;

3
for(int gg:v)
        gg+1;

测试结论:

1、在忽略测试环境、优化等因素影响的情况下,单从3种不同代码写法的逻辑效能上来说,下标访问方式无疑是最快的,比 i++ 迭代器后向自加访问方式快了近6倍,比++i 迭代器前向自加访问方式快4倍。在代码深层封装后,可能对上层代码效率产生巨大影响。

2、我们应该在for循环中尽量避免习惯性的书写类似:i < v.size(); i != v.end(); i++,等耗时重复的界限判断等操作和迭代器后向自加操作;

3、在Release版本下,编译器对代码的优化选项将会大大提升代码效率,使得以上不同代码写法效率趋同,但总体来说下标访问方式仍然是最快的,效率是其他几种方式的1.5~1.8倍,执行效率上的提升程度非常可观。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

和道一文字_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值