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

  • 初始化列表

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

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

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

vector<int> v = {,,,,,,,,,};
map<int,int> map = {{,},{,},{,,{,}};

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

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

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

struct A
{
int x;
int y;
};

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

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

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

vector<A> v = {{,},{,}};

上面的代码表示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[];

  对于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。

(原创)C++11改进我们的程序之简化我们的程序(四)的更多相关文章

  1. (原创)C++11改进我们的程序之简化我们的程序(八)

    本次要讲的是如何通过泛型函数来简化我们的程序. 泛型函数除了之前介绍的一些优点外还有两个重要的优点 1.消除重复逻辑,提高程序的内聚性和健壮性 泛型函数在某种程度上用来弥补泛型类型的不足.通过泛型类型 ...

  2. (原创)C++11改进我们的程序之简化我们的程序(二)

    这次要讲的是:C++11如何通过组合函数来简化我们的程序.关于组合函数,大家可能对这个概念有点陌生.组合函数是将N个一元函数组成一种更复杂的函数,每个函数的返回值作为参数传给下一个函数,直到传到最后一 ...

  3. C++11改进我们的程序之简化我们的程序1

    C++11改进我们的程序之简化我们的程序(一) C++11在很多方面可以简化我们的程序开发,我会在“简化我们的程序”这一系列的博文中一一讲到,敬请关注.这次要讲的是:C++11如何通过获取函数模板的返 ...

  4. (原创)C++11改进我们的程序之简化我们的程序(三)

    这次要讲的是:C++11如何通过auto.decltype和返回值后置来简化我们的程序. auto和c#中的var类似,都是在初始化时自动推断出数据类型.当某个变量的返回值难于书写时,或者不太确定返回 ...

  5. (原创)C++11改进我们的程序之简化我们的程序(一)

    C++11在很多方面可以简化我们的程序开发,我会在“简化我们的程序”这一系列的博文中一一讲到,敬请关注.这次要讲的是:C++11如何通过获取函数模板的返回值类型来简化我们的程序.在谈到简化之前,我们先 ...

  6. (原创)c++11改进我们的模式之改进代理模式,实现通用的AOP框架

    c++11 boost技术交流群:296561497,欢迎大家来交流技术. 本次要讲的时候如何改进代理模式,具体来说是动态代理模式,动态代理模式一般实现AOP框架,不懂AOP的童鞋看这里.我前面的博文 ...

  7. (原创)c++11改进我们的模式之改进命令模式

    模式虽然精妙,却难完美,比如观察者模式中观察者生命周期的问题:比如访问者模式中循环依赖的问题等等:其它很多模式也存在这样那样的一些不足之处,如使用场景受限.实现复杂.不够简洁.不够通用等.但我觉得不足 ...

  8. (原创)c++11改进我们的模式之改进访问者模式

    本次讲c++11改进我们的模式之改进访问者模式 访问者模式是GOF23个设计模式中比较复杂的模式之一,但是它的功能也很强大,非常适合稳定的继承层次中对象的访问,可以在不修改被访问对象的情况下,动态添加 ...

  9. (原创)C++11改进我们的程序之简化我们的程序(七)

    这次要讲的内容是:c++11中的tuple(元组).tuple看似简单,其实它是简约而不简单,可以说它是c++11中一个既简单又复杂的东东,关于它简单的一面是它很容易使用,复杂的一面是它内部隐藏了太多 ...

随机推荐

  1. 基于全注解的SpringMVC+Spring4.2+hibernate4.3框架搭建

    概述 从0到1教你搭建spring+springMVC+hibernate整合框架,基于注解. 本教程框架为基于全注解的SpringMVC+Spring4.2+hibernate4.3,开发工具为my ...

  2. requires the FLAG_ACTIVITY_NEW_TASK flag

    07-18 16:34:05.891: E/AndroidRuntime(18396): FATAL EXCEPTION: main 07-18 16:34:05.891: E/AndroidRunt ...

  3. Dockerfile 构建后端tomcat应用并用shell脚本实现jenkins自动构建

    Dockerfile 文件构建docker镜像 FROM centos MAINTAINER zhaoweifeng "zh******tech.cn" ENV LANG en_U ...

  4. hibernate的批量删除

    转自:hibernate的批量删除一般而言,hibernate的批量删除的写法有两种,一种是hibernate内置的批量删除,不过他的批量删除是将每条记录逐一生成删除语句,其效率极低,当然我们可以使用 ...

  5. 【备份】使用mysqldump 实现rename database name(mysql数据库改名称)

    需求:将jxl_credit改名为jxl_test;输入:jxl_credit输出: jxl_test; 实现方式:1).新建jxl_test,2).备份jxl_credit到本地,3).然后将备份数 ...

  6. 《JAVA与模式》之装修者模式

    装饰者模式 动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性的替代方案. 具体被装饰者和抽象装饰类都继承于抽象被装饰者类,继承的是类型,而不是行为.行为来自装饰者和基础组件,或与其他 ...

  7. 一步一步掌握java的线程机制(二)----Thread的生命周期

    之前讲到Thread的创建,那是Thread生命周期的第一步,其后就是通过start()方法来启动Thread,它会执行一些内部的管理工作然后调用Thread的run()方法,此时该Thread就是a ...

  8. mvc 缓存页面 减轻服务器压力

    方法: using System; using System.Collections.Generic; using System.Linq; using System.Web; using Syste ...

  9. @property与@synthesize的差别

    上一篇文章我有讲到self.与_的差别,往往和这个问题相伴随的是我困惑的问题是"@property与@synthesize的差别" @property的使用方法 @interfac ...

  10. Javascript MVC 学习笔记(一) 模型和数据

    写在前面 近期在看<MVC的Javascript富应用开发>一书.本来是抱着一口气读完的想法去看的.结果才看了一点就傻眼了:太多不懂的地方了. 仅仅好看一点查一点,一点一点往下看吧,进度虽 ...