• C++11 基于范围的for循环


    【1】基于范围的for循环演化过程

    (1)C++98传统写法

     1 // C++98 传统写法
     2 
     3 #include <iostream>
     4 using namespace std;
     5 
     6 int main()
     7 {
     8     int arr[5] = { 1, 2, 3, 4, 5 };
     9 
    10     int* p = nullptr;
    11 
    12     for (p = arr; p < arr + sizeof(arr) / sizeof(arr[0]); ++p)
    13     {
    14         *p *= 2;
    15     }
    16 
    17     for (p = arr; p < arr + sizeof(arr) / sizeof(arr[0]); ++p)
    18     {
    19         cout << *p << endl;
    20     }
    21 }

    (2)利用模板库std::for_each写法

     1 // 利用模板库std::for_each写法
     2 
     3 #include <iostream>
     4 #include <algorithm>
     5 using namespace std;
     6 
     7 void action1(int& e) { e *= 2; }
     8 void action2(int& e) { cout << e << '	';  }
     9 
    10 int main()
    11 {
    12     int arr[5] = { 1, 2, 3, 4, 5 };
    13     for_each(arr, arr + sizeof(arr) / sizeof(arr[0]), action1);
    14     for_each(arr, arr + sizeof(arr) / sizeof(arr[0]), action2);
    15 }

    (3)基于范围的for循环

     1 // 基于范围的for循环
     2 
     3 #include <iostream>
     4 using namespace std;
     5 
     6 int main()
     7 {
     8     int arr[5] = { 1, 2, 3, 4, 5 };
     9     for (int& e : arr)
    10         e *= 2;
    11     for (int& e : arr)
    12         cout << e << '	';
    13 }

    (4)注意(*i)与 e的区别

     1 // 注意(*i)与 e的区别:
     2 
     3 #include <iostream>
     4 #include <vector>
     5 using namespace std;
     6 
     7 int main()
     8 {
     9     vector<int> v = { 1, 2, 3, 4, 5 };
    10     for (auto i = v.begin(); i != v.end(); ++i)
    11         cout << (*i) << endl;  // i是迭代器对象 
    12     for (auto e : v)
    13         cout << e << endl;     // e是解引用后的对象
    14 }

    (5)注意使用auto& item : vector

    使用引用可少一次拷贝构造过程,区别如下示例:

     1 #include <string>
     2 #include <vector>
     3 #include <iostream>
     4 using namespace std;
     5 
     6 struct student
     7 {
     8     string no;
     9     string name;
    10     string age;
    11     string grade;
    12 
    13     student(string no, string name, string age, string grade)
    14         : no(no)
    15         , name(name)
    16         , age(age)
    17         , grade(grade)
    18     {
    19         cout << "contrust" << endl;
    20     }
    21 
    22     student(const student& obj)
    23     {
    24         cout << "copy contrust" << endl;
    25         no = obj.no;
    26         name = obj.name;
    27         age = obj.age;
    28         grade = obj.grade;
    29     }
    30 };
    31 
    32 int main()
    33 {
    34     std::vector<student> vecStu = 
    35     {
    36         { "100", "liuq", "18", "6"},
    37         { "110", "wang", "19", "7"},
    38         { "120", "qiang", "20", "8"},
    39     };
    40 
    41     cout << "[1]不带引用的遍历过程:" << endl;
    42     for (auto item : vecStu)
    43     {
    44         cout << item.no << item.name << item.age << item.grade << endl;
    45     }
    46 
    47     cout << "[2]带引用的遍历过程:" << endl;
    48     for (auto& item : vecStu)
    49     {
    50         cout << item.no << item.name << item.age << item.grade << endl;
    51     }
    52 
    53     system("pause");
    54 }
    55 
    56 /* result:
    57 contrust
    58 contrust
    59 contrust
    60 copy contrust
    61 copy contrust
    62 copy contrust
    63 [1]不带引用的遍历过程:
    64 copy contrust
    65 100liuq186
    66 copy contrust
    67 110wang197
    68 copy contrust
    69 120qiang208
    70 [2]带引用的遍历过程:
    71 100liuq186
    72 110wang197
    73 120qiang208
    74 */

    good good study, day day up.

    顺序 选择 循环 总结

  • 相关阅读:
    mysql 查看某数据库各个表容量大小SQL
    Gated RNN(《深度学习进阶》第六章总结)
    RNN(《深度学习进阶》第五章总结)
    word2vec的改进(《深度学习进阶》第四章总结)
    201521123024 《Java程序设计》 第九周学习总结
    如何在vue项目中使用md5及base64加密
    vite+vue3.0+vue-router+vuex快速搭建项目
    vite+vue3.0搭建项目
    MySQL创建计划任务
    MySQL基础函数
  • 原文地址:https://www.cnblogs.com/Braveliu/p/12245989.html
Copyright © 2020-2023  润新知