迭代for和可初始化的if和switch
迭代for循环
-
c++11对于for的使用提供了一种新的方法,即如Python一样可基于某列表中的范围依次迭代,也即java中的for-each循环。
-
格式:
- for(data_type i : range_list){…}
- 注意是 :不是 ;
//e.g. for(auto i : {1,2,3,4,5}){ std::cout<<i<<std::ends; } //结果: 1 2 3 4 5 std::array<int,5> a={2,4,6,8,10}; //应包含头<array>,声明int数组a for(auto i : a){ std::cout<<i<<std::ends; } //结果: 2 4 6 8 10
-
特性
- 对于比遍历数组,同C语言常规for循环相比,基于范围的for循环明显是一个更好的选择,因为不用再需要事先知道数组的大小,如:遍历数组 int a[5]{1,2,3,4,5};
//传统for: for(int i ; i<5 ; i++){ cout << a[i] << endl; } //范围for: for(int i : a){ cout << i << endl; }
- 当结合使用auto关键字使用甚至不需要知道数组中元素的类型,同时可以加强代码重用性
for(auto i : a){ cout << i << endl; }
当a的元素类型为char或者其他任意类型时该行代码仍然有效,基于范围的for循环常使用auto关键字声明变量
- 当 :前的变量声明为引用时则可以直接对遍历数组元素进行更改
for(auto& i : a){ i = i + 2; } // 则a中元素变为 { 3, 4, 5, 6, 7}
带有initializer的if和switch(c++17)
-
c++17后if和switch可以带有初始化器,一般用于声明用作判断且作用域仅包含在if-else或switch作用域中的变量,好处在于可以在if-else或switch语句块之外声明同名变量
-
语法
//if: if(int i = 1 ; i < 10){ cout << i << endl; } else{ cout << i++ << endl; } //等价于 int i = 1; if(i<10){ cout << i << endl; } else{ cout << i++ << endl; } //switch: switch(int i = rand()%10 ; i){ case 0://... case 1://... //...... default:... } //等价于 int i = rand()%10; switch(i){ case 0://... case 1://... //...... default://... }