C++11中range-based for loops中&&与&的区别

不得不说外国的技术博客还是要比中国的好太多,之前一直迷茫与range-based for loops中究竟&&与&该怎么用的问题,看了一下国外的技术讨论,真是豁然开朗,而国内的技术博客,几乎就没有见这方面的东西。

for(auto i : c)

一般用for(auto i : c)就是一个正常的拷贝,如果是一个类的话,会调用复制构造函数。

vector<int> c = {1, 3, 5, 7, 9};

for (auto i : c)
    cout << i << ' ';

如果遍历的是基本类型的话,可以这么用,如果是类的话,开销比较大,不推荐。

for(auto &i : c)与for(const auto &i : c)

这个就是i是c的引用,开销小,不会调用复制构造函数,如果不想改变原来的值得花,可以用for(const auto &i : c),如果想要改变的话,用for(auto &i : c)

vector<int> c = {1, 3, 5, 7, 9};
for (auto &i : c)  
    i *= 10;      

for (auto i : c)
    cout << i << ' ';   //输出10,30,50,70,90

for(auto &&i : c)

重头戏在这个地方啦,如果c为一个proxy iterators的话,这方面的典型例子就是vector< bool>详见我的上一篇文章,谈vector< bool>的特殊性——为什么它不是STL容器
有一个地方需要注意:

vector<bool> c{ false, true, false, true, false };
for (auto i : c)
    cout << i << " ";            //输出0 1 0 1 0
cout << endl;
for (auto i : c){
    i = !i;
}
for (auto i : c)
    cout << i << " ";            //输出1 0 1 0 1
cout << endl;

如果对于vector< bool>用for(auto i : c),对i做改变,也会影响到c。
而对于vector< bool>用for(auto &i : c)在g++上会报错【但是我在VS上不会报错,尴尬】
所以此时需要用右值引用for(auto &&i : c)

vector<bool> c{ false, true, false, true, false };
for (auto &&i : c){
    i = !i;
}

而&&还可以用于非proxy iterators的情况,所以一般情况下,如果要修改遍历的值,都要用

for (auto &&i : c)

如果不修改的话,要用

for (const auto &i : c)

因为常量引用可以绑定到一个临时值上面,用来延长临时值得生命周期,详见我之前的一篇Blog:C++中const和引用的坑点总结

参考资料

Use auto&& for range-based for loops

What is the correct way of using C++11’s range-based for?

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值