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

    xiaoxiao2022-07-03  175

    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?   ---------------------   作者:哈乐笑   来源:   原文:https://blog.csdn.net/haolexiao/article/details/56842552   版权声明:本文为博主原创文章,转载请附上博文链接!

    最新回复(0)