这次要讲的是: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. Ubuntu x86-64汇编(4) 数值操作指令

    整数乘法指令 Integer Multiplication 对于有符号数的乘法有特殊的规则, 因此无符号数乘法和有符号数乘法对应着不同的指令mul和imul. 乘法会产生两倍尺寸的数值结果, 即两个n ...

  2. Ubuntu x86-64汇编(2)

    开发工具链 汇编编译器: yasm连接器: ld载入工具: os自带Debug工具:  ddd yasm安装 .tar.gz cd yasm-/ ./configure --prefix=/opt/y ...

  3. kafka负载均衡相关资料收集(三)

    apache kafka系列之Producer处理逻辑 下文是转载的,原文链接地址:点这儿 [转] Kafka ProducerKafka Producer处理逻辑kafka生产者处理逻辑apache ...

  4. Octave及其工具包的安装

    Octave的安装: http://blog.sina.com.cn/s/blog_1358485f70102wmpa.html http://www.gnu.org/software/octave/ ...

  5. mysql5.7创建用户授权删除用户撤销授权

    一, 创建用户: 命令: CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 说明:username - 你将创建的用户名, host - ...

  6. shell脚本中解决SCP命令需要输入密码的问题

    使用密钥文件.       这里假设主机A(192.168.100.3)用来获到主机B(192.168.100.4)的文件.   在主机A上执行如下命令来生成配对密钥: ssh-keygen -t r ...

  7. linux下磁盘相关工具(待整理)

    一.概述: fsck tune2fs mke2fs badblocks mkfs* fdisk mount umount mknod e2label blkid hdparm mkswap swapo ...

  8. 【MySQL】mysql出现错误“ Every derived table must have its own alias”

    Every derived table must have its own alias 这句话的意思是说每个派生出来的表都必须有一个自己的别名 一般在多表查询时,会出现此错误. 因为,进行嵌套查询的时 ...

  9. Oracle 12C -- 预定义audit policies

    在12C中,预定义了三种审计策略:ora_secureconfig,ora_database_parameter,ora_account_mgmt可以通过脚本$ORACLE_HOME/rdbms/ad ...

  10. Oracle 12C -- 删除PDB

    删除PDB SQL> select con_id,pdb_name,status from cdb_pdbs; CON_ID PDB_NAME STATUS ---------- ------- ...