1.4.1 for循环的新用法
algorithm头文件中的for_each ( 同样不是基于范围的循环 ):
std::for_each(arr.begin(), arr_end(), do_cout);
基于范围的for循环,建议使用引用或者const引用:
std::vector<int> arr;
for(const auto& n : arr)
{
std::cout << n++ <<std::endl;
}
1.4.2 基于范围的for循环的使用细节
- 对于map等关联性容器来说,auto提取的类型是std::pair,需要用first和second来提取键值。
- auto推导出的类型是容器的value_type,而非迭代器。
- 容器本身的约束,如果对set(内部元素为只读)进行循环的话,auto&会被推导为const type&,对map的遍历不能修改first。
- 无论基于范围的for循环迭代多少次,冒号后的表达式只会在第一次迭代之前被执行。
- 不允许在迭代过程中对容器进行修改,会造成无法预估的影响。
1.4.3 让基于范围的for循环支持自定义类型
基于范围的for循环本质是通过寻找容器提供的begin和end迭代器来确定范围:
- 若容器是一个普通array对象,则begin为array的首地址,end为首地址加长度。
- 若容器是一个类对象,则通过查找类的 begin( ) 和 end( ) 方法定位迭代器。
- 否则将试图使用全局的 begin 和 end 函数来定位迭代器。
所以对于自定义类型来说,分别实现 begin() 和 end() 方法即可。