首页 > 编程语言 >C++11 新特性之Range-based for loops

C++11 新特性之Range-based for loops

时间:2022-12-27 11:32:42浏览次数:69  
标签:11 __ begin based int range Range vec const


声明:本文少量代码转载自Alex Allain的文章 ​​http://www.cprogramming.com/c++11/c++11-ranged-for-loop.html​

很多语言都有Range-based for loops这个功能,现在C++终于知道把这个重要功能加进语法中了。这个功能实在不知道该怎么翻译,语文没有学到家。

基本语法




for ( range_declaration : range_expression) loop_statement



比如说:



1. vector<int> vec;  
2. vec.push_back( 1 );
3. vec.push_back( 2 );
4.
5. for (int i : vec )
6. {
7. cout << i;
8. }


for语言这么写可以很方便地遍历vector这类的容器。具体什么样的东西可以遍历呢?这个留在后面说。

对于比较复杂的容器可以用auto语句来简化类型声明


    1. map<string, string> complexVector;  
    2. for ( auto complexVectorEntry : complexVector )
    3. {
    4. " < " << complexVectorEntry.second << ">" << endl;
    5. }



    这两个例子中都没有修改遍历元素的值。如果你要想修改它们的值,请使用引用类型



    1. vector<int> vec;  
    2. vec.push_back( 1 );
    3. vec.push_back( 2 );
    4.
    5. for (auto& i : vec )
    6. {
    7. i++;
    8. }


    continue语句来开始下一次迭代,使用break跳出循环。这一点和普通的for循环一样。

    深入分析


    1. for ( range_declaration : range_expression) loop_statement



    “等价于”



    1. {  
    2. auto && __range = range_expression ;
    3. auto __begin = begin_expr(__range);
    4. auto __end = end_expr(__range);
    5. for (;__begin != __end; ++__begin) {
    6. range_declaration = *__begin;
    7. loop_statement
    8. }
    9. }



    请注意,“等价于”并不表示编译器就是这么实现range-based for loops的。只是说两者的运行效果等价

    begin_expr 和 end_expr 的定义如下:

    1. 对于数组类型 begin_expr和end_expr分别等于(__range)和(__range + __bound)
    2. 对于STL中的容器,两者分别等于__range.begin()和__range.end()
    3. 对于其他类型,两者分别等于begin(__range)和end(__range)。编译器将会通过参数类型来找到合适的begin和end函数

    让自定义的类可以迭代



    通过ranged-based for loops的等价语句可以看出,可以知道只要符合一定的要求,那么自己定义的类也可以放在ranged-based for loops中进行迭代。事实上要想进行迭代,一个类需要满足以下条件:


    1. begin函数和end函数,作用是分别指向第一个数据和最后一个数据。返回值是一个可以自己定义的迭代器。既可以是成员函数,也可以是非成员函数。
    2. 迭代器本身支持* ++ !=运算符,既可以是成员函数,也可以是非成员函数。

    比如说下面这个类:



    1. #include <iostream>  
    2.
    3. using namespace std;
    4.
    5.
    6. class IntVector;
    7.
    8. class Iter
    9. {
    10. public:
    11. const IntVector* p_vec, int pos)
    12. : _pos( pos )
    13. , _p_vec( p_vec )
    14. { }
    15.
    16. // these three methods form the basis of an iterator for use with
    17. // a range-based for loop
    18. bool
    19. const Iter& other) const
    20. {
    21. return _pos != other._pos;
    22. }
    23.
    24. // this method must be defined after the definition of IntVector
    25. // since it needs to use it
    26. int operator* () const;
    27.
    28. const Iter& operator++ ()
    29. {
    30. ++_pos;
    31. return *this;
    32. }
    33.
    34. private:
    35. int _pos;
    36. const IntVector *_p_vec;
    37. };
    38.
    39. class IntVector
    40. {
    41. public:
    42. IntVector ()
    43. {
    44. }
    45.
    46. int get (int col) const
    47. {
    48. return _data[ col ];
    49. }
    50. const
    51. {
    52. return Iter( this, 0 );
    53. }
    54.
    55. const
    56. {
    57. return Iter( this, 100 );
    58. }
    59.
    60. void set (int index, int val)
    61. {
    62. _data[ index ] = val;
    63. }
    64.
    65. private:
    66. int _data[ 100 ];
    67. };
    68.
    69. int
    70. Iter::operator* () const
    71. {
    72. return _p_vec->get( _pos );
    73. }
    74.
    75.
    76. int main()
    77. {
    78. IntVector v;
    79. for ( int i = 0; i < 100; i++ )
    80. {
    81. v.set( i , i );
    82. }
    83. for ( int i : v ) { cout << i << endl; }
    84. }



    IntVector就是一个想要进行迭代的类。它的being和end函数返回一个迭代器Iter。而Iter支持* != ++运算符。

    标签:11,__,begin,based,int,range,Range,vec,const
    From: https://blog.51cto.com/u_15923385/5971866

    相关文章

    • C++11:列表初始化
      在C++98/03中,对象初始化方法有很多种,如下代码所示://初始化列表inti_arr[3]={1,2,3};//普通数组structA{intx;structB{inti;......
    • 基于pybind11实现Python调用c++编写的CV算法--上(Windows+VS)
      C++是一种编译型(compiled)语言,设计重点是性能、效率和使用灵活性,偏向于系统编程、嵌入式、资源受限的软件和系统。Python是一种解释型(interpreted)语言,同样也支持不同的......
    • 关于imatest Colorcheck模块的测试及结果分析(imatest版本 5.2.11)
      一、Colorcheck作用:   1、测试色彩准确性   2、测试白平衡   3、测试噪声或信噪比二、测试环境要求:   1、拍摄图卡距离:图卡按中心......
    • 11g rac数据库节点1启动异常,告警ORA-16188
      问题描述:11grac数据库节点1启动异常,告警ORA-16188,如下所示:环境介绍:该rac环境此前搭建过dg,将dg拆除后,一次系统重启便出现节点1数据库无法正常启动,告警ORA-16188.1、异常重现......
    • AcWing. 1146 新的开始
      传送门题目大意\(\qquad\)给一张图,每个点有对应的点权,每条边有对应的边权。可以有如下几种选择:\(\qquad\quad\)\(1.\)选择一个没通电的点,花费\(v_i\)。\(\qquad\quad\)......
    • 【SDOI2011】【BZOJ2242】计算器
      Description你被要求设计一个计算器完成以下三项任务:1、给定y、z、p,计算y^zmodp的值;2、给定y、z、p,计算满足xy≡z(modp)的最小非负整数;3、给定y、z......
    • 【51Nod1133】不重叠的线段
      DescriptionX轴上有N条线段,每条线段有1个起点S和终点E。最多能够选出多少条互不重叠的线段。(注:起点或终点重叠,不算重叠)。例如:[15][23][36],可以选[23][36],这2条线段互......
    • Xmind 2022 for Mac(思维导图软件) 22.11.2556中文版
      Xmind2022forMac是一款全功能的思维导图软件,拥有专业实用的功能,包括思维管理、商务演示、与办公软件协同工作等功能,让您的办公更有效,还加入了演讲模式,在演说模式可自动生......
    • 2022-A survey of modern deep learning based object detection models
      #Asurveyofmoderndeeplearningbasedobjectdetectionmodels#paper1.paper-info1.1MetadataAuthor::[[SyedSahilAbbasZaidi]],[[MohammadSamarAns......
    • .NET中国开发者峰会11.9 下午分会场1 内容解析
      China.NETConf2019中国.NET开发者峰会即将在上海召开,这次大会是一届完全由社区组织举办的中国.NET开发者盛会,我们筹备大会之初就定下了大会的主题是“开源、共享、创......