(原创)C++11改进我们的程序之简化我们的程序(四)
这次要讲的是: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改进我们的程序之简化我们的程序(四)的更多相关文章
- (原创)C++11改进我们的程序之简化我们的程序(八)
本次要讲的是如何通过泛型函数来简化我们的程序. 泛型函数除了之前介绍的一些优点外还有两个重要的优点 1.消除重复逻辑,提高程序的内聚性和健壮性 泛型函数在某种程度上用来弥补泛型类型的不足.通过泛型类型 ...
- (原创)C++11改进我们的程序之简化我们的程序(二)
这次要讲的是:C++11如何通过组合函数来简化我们的程序.关于组合函数,大家可能对这个概念有点陌生.组合函数是将N个一元函数组成一种更复杂的函数,每个函数的返回值作为参数传给下一个函数,直到传到最后一 ...
- C++11改进我们的程序之简化我们的程序1
C++11改进我们的程序之简化我们的程序(一) C++11在很多方面可以简化我们的程序开发,我会在“简化我们的程序”这一系列的博文中一一讲到,敬请关注.这次要讲的是:C++11如何通过获取函数模板的返 ...
- (原创)C++11改进我们的程序之简化我们的程序(三)
这次要讲的是:C++11如何通过auto.decltype和返回值后置来简化我们的程序. auto和c#中的var类似,都是在初始化时自动推断出数据类型.当某个变量的返回值难于书写时,或者不太确定返回 ...
- (原创)C++11改进我们的程序之简化我们的程序(一)
C++11在很多方面可以简化我们的程序开发,我会在“简化我们的程序”这一系列的博文中一一讲到,敬请关注.这次要讲的是:C++11如何通过获取函数模板的返回值类型来简化我们的程序.在谈到简化之前,我们先 ...
- (原创)c++11改进我们的模式之改进代理模式,实现通用的AOP框架
c++11 boost技术交流群:296561497,欢迎大家来交流技术. 本次要讲的时候如何改进代理模式,具体来说是动态代理模式,动态代理模式一般实现AOP框架,不懂AOP的童鞋看这里.我前面的博文 ...
- (原创)c++11改进我们的模式之改进命令模式
模式虽然精妙,却难完美,比如观察者模式中观察者生命周期的问题:比如访问者模式中循环依赖的问题等等:其它很多模式也存在这样那样的一些不足之处,如使用场景受限.实现复杂.不够简洁.不够通用等.但我觉得不足 ...
- (原创)c++11改进我们的模式之改进访问者模式
本次讲c++11改进我们的模式之改进访问者模式 访问者模式是GOF23个设计模式中比较复杂的模式之一,但是它的功能也很强大,非常适合稳定的继承层次中对象的访问,可以在不修改被访问对象的情况下,动态添加 ...
- (原创)C++11改进我们的程序之简化我们的程序(七)
这次要讲的内容是:c++11中的tuple(元组).tuple看似简单,其实它是简约而不简单,可以说它是c++11中一个既简单又复杂的东东,关于它简单的一面是它很容易使用,复杂的一面是它内部隐藏了太多 ...
随机推荐
- JAVA微信扫码支付模式二功能实现完整例子
概述 本例子实现微信扫码支付模式二的支付功能,应用场景是,web网站微信扫码支付.实现从点击付费按钮.到弹出二维码.到用户用手机微信扫码支付.到手机上用户付费成功.web网页再自动调整到支付成功后的页 ...
- ios用户登录记住密码
登录 记录已登录用户步骤,存入偏好设置中存储放入一个数组. 具体存储 :存储用户到偏好设置中,其中用户是一个数组 向服务器响应客户端后的一些操作 (如果响应数据成功)其中用户和密码是一一对应的 .1先 ...
- ios中GDataXML解析XML文档
参考文章 http://blog.csdn.net/ryantang03/article/details/7868246 适合解析一个节点多个属性要用GDataXml 格式如下 <?xml ve ...
- Swift3 Scanner用法之判断是否数字、提取字符串里的数字
1.判断是否数字 /// 判断是否是数字 /// /// - Parameter string: <#string description#> /// - Returns: <#re ...
- MATLAB 设置文件的相对路径
加载文件使用命令:load(' 文件名 or 文件路径 ') 1.文件在当前路径下: 直接 load('session.mat') 2.文件在下一级路径下: 使用 load (' .\下一级路径的 ...
- 【算法】MD5加密
1.什么是MD5 MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致.是计算机广泛使用的杂凑算法之一(又译摘要算法.哈希算法),主流编程语言普遍 ...
- 【Linux】双向重导向命令tee
想个简单的东西,我们知道 > 会将数据流整个传送给文件或装置,因此我们除非去读取该文件或装置, 否则就无法继续利用这个数据流.万一我想要将这个数据流的处理过程中将某段信息存下来,应该怎么做? 利 ...
- 使用 Cookie 而无需 ASP.NET 核心标识的身份验证
https://docs.microsoft.com/zh-cn/aspnet/core/security/authentication/cookie?tabs=aspnetcore2x#tabpan ...
- 使用ShellExecute打开文件夹并选中文件
原文链接: http://futurecode.is-programmer.com/posts/24780.html 假设在C:\目录下存在文件a.txt. 打开这个目录是ShellExecute的常 ...
- Android开发中的神坑和知识点记录
1.SDK Manager.exe闪退的问题 http://blog.csdn.net/fambit025/article/details/26984345 1.找到android.bat,在源码处找 ...