zoukankan      html  css  js  c++  java
  • (原创)C++11改进我们的程序之简化我们的程序(四)

    这次要讲的是:c++11统一初始化、统一begin()/end()和for-loop循环如何简化我们的程序

    • 初始化列表

    c++11之前有各种各样的初始化语法,有时候初始化的时候还挺麻烦,比较典型的如vector和map的初始化。

    vector<int> v;
    for(int i=0;i<10;i++)
    {
    v.push_back(i);
    }
    
    map<int,int> map;
    for(int i=0;i<10;i++)
    {
    map.insert(make_pair(i,i));
    }

      这种写法比较繁琐,而且不够直观。现在c++11中你可以这样写了:

    vector<int> v = {0,1,2,3,4,5,6,7,8,9};
    map<int,int> map = {{0,0},{1,1},{2,2,{3,3}};

    不用再手动去push_back或者insert了,这样写很简单也很直观。不仅仅是容器的初始化可以这样,普通的数组也可以这样写:

    int int_array[3] = {1,2,3};
    string str_array[3] = {"","",""};

    其实对结构体和类也一样可以很方便的初始化,例如:

    struct A
    {
    int x;
    int y;
    };

    vector<A> v在c++11之前如果要放入两个结构体A的话,要这样写:

    A a1;
    a1.x = 1;
    a1.y = 2;
    v.push_back(a1);
    
    A a2;
    a2.x = 1;
    a2.y = 2;
    v.push_back(a2);

    vector<A>的初始化显得十分繁琐,现在c++11让我们从这种繁琐之中解脱出来了,c++11中可以这样写:

    vector<A> v = {{1,2},{3,4}};

    上面的代码表示v中有两个结构体A,内部成员变量x,y的初始化值为1,2以及3,4;一行代码,一步到位,简洁明了,是不是很清爽,我非常喜欢这种简洁而直接的初始化方式。

    • 统一的begin()/end()

      c++11之前只有容器有自己的begin()和end(),我们可以很方便的按照统一的方式去遍历集合,然而一些其他类型的数组没有却没有begin()/end()导致我们不能按照统一的方式去遍历集合。

    vevtor<int> v;
    for(auto it=v.begin(); it!=v.end(); ++it)
    {
    //do something
    }
    
    int array[10];

      对于array我们却不能像vector那样去遍历。
      现在c++11增加了非成员的begin()和end(), 就是说这个begin()和end()不是属于某个类型的,而是所有集合和数组所共有的,使得我们可以按照统一的方式去遍历集合和数组了。你可以一种通用方式去遍历,类似于:

    for(auto it = begin(range); it!=end(range); it++)
    {
    //do something
    }

      这个range可以vecotr,map等容器,也可以是int类型的普通数组,这样我们就可以统一的方式去遍历容器和数组了,可以写出更加泛化和通用的代码了。

    • for-loop循环

      c++11新增了for-loop循环方式,上面遍历容器的方法还可以写成:

    for(auto item : range)
    {
    }
    
    for(auto& item : range)
    {
    }

      这种方式直接获取range中的元素,可以以值或者引用方式获取。这种方式比起之前的写法要更简洁了。这种for-loop写法不仅仅对容器和数组有效,对自定义类型同样有效,不过前提是自定义类型要实现begin(),end(),因为for-loop内部实现就是通过begin(),end()去迭代整个范围的。

      初始化列表和for-loop循环在c#和java中比较早就引入了,现在c++也赶上来了,c++11引入这些现代编程语言的特性,让我们的代码变得更简洁、更modern。

  • 相关阅读:
    VirtualBox不显示64bit版本的iso
    学习和参考资料
    神经网络和机器学习资料整理
    动态空间释放时的错误操作引起的运行时错误
    WIN7 X64的运行命令窗口
    vs2010中的ADO控件及绑定控件
    AdventureWorks2012.mdf的使用
    VS2008/2010 都不能使用Access2010数据库
    WIN7 64位操作系统 无法找到Access驱动
    如何在VS2010的VC++ 基于对话框的MFC程序中添加菜单
  • 原文地址:https://www.cnblogs.com/qicosmos/p/3299962.html
Copyright © 2011-2022 走看看