【现代程序设计】【homework-07】
C++11 中值得关注的几大变化
1.Lambda 表达式
Lambda表达式来源于函数式编程,说白就了就是在使用的地方定义函数,有的语言叫“闭包”,如果 lambda 函数没有传回值(例如 void ),其回返类型可被完全忽略。 定义在与 lambda 函数相同作用域的变量参考也可以被使用。这种的变量集合一般被称作 closure(闭包)。表达式的简单语法如下
char s[]="Hello World!";
int Uppercase = ; //modified by the lambda
for_each(s, s+sizeof(s), [&Uppercase] (char c)
{
if (isupper(c))
Uppercase++;
});
cout << Uppercase << " uppercase letters in: " << s <<endl;
在传统的STL中for_each() 
这个玩意最后那个参数需要一个“函数对象”,所谓函数对象,其实是一个class,这个class重载了operator(),于是这个对象可以像函数的式样的使用。实现一个函数对象并不容易,需要使用template,比如下面这个例子就是函数对象的简单例子(实际的实现远比这个复杂):
template <class T>
class less {
public: bool operator()(const T&l, const T&r)const
{
return l < r;
}
};
所以,C++引入Lambda的最主要原因就是1)可以定义匿名函数,2)编译器会把其转成函数对象。相信你会和我一样,会疑问为什么以前STL中的ptr_fun()这个函数对象不能用?(ptr_fun()就是把一个自然函数转成函数对象的)。原因是,ptr_fun() 的局限是其接收的自然函数只能有1或2个参数。
那么,除了方便外,为什么一定要使用Lambda呢?它比传统的函数或是函数对象有什么好处呢?我个人所理解的是,这种函数之年以叫“闭包”,就是因为其限制了别人的访问,更私有。也可以认为他是一次性的方法。Lambda表达式应该是简洁的,极私有的,为了更易的代码和更方便的编程。
2.自动类型推导 auto
在在这一节中,原文主要介绍了两个关键字 auto 和 deltype,示例如下
auto x=0; //x has type int because 0 is int auto c='a'; //char auto d=0.5; //double auto national_debt=14400000000000LL;//long longauto 最大的好处就是让代码简洁,尤其是那些模板类的声明,比如:STL中的容器的迭代子类型。
vector<int>::const_iterator ci = vi.begin();可以变成:
auto ci = vi.begin();模板这个特性让C++的代码变得很难读,不信你可以看看STL的源码,那是一个乱啊。使用auto必需一个初始化值,编译器可以通过这个初始化值推导出类型。因为auto是来简化模板类引入的代码难读的问题,如上面的示例,iteration这种类型就最适合用auto的,但是,我们不应该把其滥用。
比如下面的代码的可读性就降低了。因为,我不知道ProcessData返回什么?int? bool? 还是对象?或是别的什么?这让你后面的程序不知道怎么做。
auto obj = ProcessData(someVariables);但是下面的程序就没有问题,因为pObject的型别在后面的new中有了。
auto pObject = new SomeType<OtherType>::SomeOtherType();3.自动化推导 decltype
关于 decltype 是一个操作符,其可以评估括号内表达式的类型,其规则如下:
- 如果表达式e是一个变量,那么就是这个变量的类型。
- 如果表达式e是一个函数,那么就是这个函数返回值的类型。
- 如果不符合1和2,如果e是左值,类型为T,那么decltype(e)是T&;如果是右值,则是T。
原文给出的示例如下,我们可以看到,这个让的确我们的定义变量省了很多事。
| 1 2 3 | constvector<int> vi; typedefdecltype (vi.begin()) CIT; CIT another_const_iterator; | 
还有一个适合的用法是用来typedef函数指针,也会省很多事。比如:
decltype(&myfunc) pfunc = 0;   typedef decltype(&A::func1) type;Wikipedia 上是这么说的(关于decltype的规则见上)
#include <vector>   int main() {     const std::vector<int> v(1);     auto a = v[0];        // a 的类型是 int     decltype(v[0]) b = 1; // b 的类型是 const int&, 因为函数的返回类型是                           // std::vector<int>::operator[](size_type) const     auto c = 0;           // c 的类型是 int     auto d = c;           // d 的类型是 int     decltype(c) e;        // e 的类型是 int, 因为 c 的类型是int     decltype((c)) f = c;  // f 的类型是 int&, 因为 (c) 是左值     decltype(0) g;        // g 的类型是 int, 因为 0 是右值 }function 模板”,
template< typename LHS, typename RHS>   auto AddingFunc(const LHS &lhs, const RHS &rhs) -> decltype(lhs+rhs) {return lhs + rhs;}来扩展了已有的模板技术的不足。怎么个不足呢?在上例中,我不知道AddingFunc会接收什么样类型的对象,这两个对象的 +
操作符返回的类型也不知道,老的模板函数无法定义AddingFunc返回值和这两个对象相加后的返回值匹配,所以,你可以使用上述的这种定义。
C/C++的初始化的方法比较,C++ 11 用大括号统一了这些初始化的方法。
比如:POD的类型。
| 1 2 | intarr[4]={0,1,2,3}; structtmtoday={0}; | 
关于POD相说两句,所谓POD就是Plain Old Data,当class/struct是极简的(trivial)、属于标准布局(standard-layout),以及他的所有非静态(non-static)成员都是POD时,会被视为POD。如:
| 1 2 3 | structA { intm; }; // POD structB { ~B(); intm; }; // non-POD, compiler generated default ctor structC { C() : m() {}; ~C(); intm; }; // non-POD, default-initialising m | 
POD的初始化有点怪,比如上例,new A; 和new A(); 是不一样的,对于其内部的m,前者没有被初始化,后者被初始化了(不同 的编译器行为不一样,VC++和GCC不一样)。而非POD的初始化,则都会被初始化。
从这点可以看出,C/C++的初始化问题很奇怪,所以,在C++ 2011版中就做了统一。原文作者给出了如下的示例:
| 1 2 3 4 5 6 7 8 9 | C c {0,0}; //C++11 only. 相当于: C c(0,0);  int* a = newint[3] { 1, 2, 0 }; /C++11 only  classX {     inta[4];     public:         X() : a{1,2,3,4} {} //C++11, member array initializer }; | 
容器的初始化:
| 1 2 3 4 5 | // C++11 container initializer vector<string> vs={ "first", "second", "third"}; map singers = { {"Lady Gaga", "+1 (212) 555-7890"}, {"Beyonce Knowles", "+1 (212) 555-0987"}}; | 
还支持像Java一样的成员初始化:
| 1 2 3 4 5 6 | classC {    inta=7; //C++11 only  public:    C(); }; | 
【现代程序设计】【homework-07】的更多相关文章
- 标准C程序设计七---07
		Linux应用 编程深入 语言编程 标准C程序设计七---经典C11程序设计 以下内容为阅读: <标准C程序设计>(第7版) 作者 ... 
- 现代程序设计homework——04
		题目: 详见:http://www.cnblogs.com/xinz/p/3341551.html 题目本身确实很难,“很难想到一个比较优雅的算法”,这是一个老师请来专门讲解这道题的大牛的原话.确实, ... 
- 软工+C(9): 助教指南,持续更新...
		上一篇:提问与回复 下一篇:从命令行开始逐步培养编程能力(Java) 目录: ** 0x00 Handshake ** 0x01 点评 ** 0x02 评分 ** 0x03 知识储备 ** 0x04 ... 
- 2012年游戏软件开发独立本科段01B0815自考科目教材
		代码-----------教材名----------------------------版本----------作者 03708--------中国近现代史纲要----------------高教08 ... 
- 20145219 《Java程序设计》第07周学习总结
		20145219 <Java程序设计>第07周学习总结 教材学习内容总结 认识时间与日期 时间的度量 1.格林威治时间(GMT):通过观察太阳而得,因为地球公转轨道为椭圆形且速度不一,本身 ... 
- 20145210 《Java程序设计》第07周学习总结
		教材学习内容总结 第十二章 Lambda 12.1 认识Lambda语法 •Lambda 教材的引入循序渐近.深入浅出 •如果使用JDK8的话,可以使用Lambda特性去除重复的信息,例: Compa ... 
- 长春理工大学第十四届程序设计竞赛(重现赛)L.Homework Stream
		链接:https://ac.nowcoder.com/acm/contest/912/L 题意: 作为大珩班尖子生,小r每天有很多作业要完成,例如工图.工图和工图. 很显然,做作业是要有顺序的.作业之 ... 
- c语言1作业07
		这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-4/homework/9932 我在这个课程的目 ... 
- Java程序设计学习笔记(一)
		时间:2015-6-2 23:04 程序员,程序猿,程序媛,码农 ------------------------------------------------------- --Java的应用 ... 
- 【实战Java高并发程序设计6】挑战无锁算法:无锁的Vector实现
		[实战Java高并发程序设计 1]Java中的指针:Unsafe类 [实战Java高并发程序设计 2]无锁的对象引用:AtomicReference [实战Java高并发程序设计 3]带有时间戳的对象 ... 
随机推荐
- netty 解决TCP粘包与拆包问题(三)
			今天使用netty的固定长度进行解码 固定长度解码的原理就是按照指定消息的长度对消息自动解码. 在netty实现中,只需要采用FiexedLengthFrameDecoder解码器即可... 以下是服 ... 
- (三)CSS高级语法
			选择器分组 可以对选择器进行分组,被分组的选择器可以分享相同的声明,用逗号将需要分组的选择器分开.例如: h1,h2,h3,h4,h5,h6 { color: green; } 继承以及其问题一般,子 ... 
- [HDOJ1811]Rank of Tetris(并查集、拓扑排序)
			题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1811 求一堆数据的拓扑序. 处理:x>y就是x到y一条边,x<y就是y到x一条边.关键问题 ... 
- iOS学习笔记:iOS核心动画中的常用类型
			CATransaction 当我们在自定义的图层上修改某些支持动画的属性时,系统会为该属性的修改自动产生动画.这种其实属于隐式动画.隐式动画要得益于CATransaction. 一个CATransac ... 
- Web内容管理系统 Magnolia 安装使用-挖掘优良的架构(2)
			在Windows上安装社区版 tomcat集成版 Magnolia CMS社区版本为免费发行,不需要任何GNU通用公共许可协议(第3版)条款下的授权(这个许可协议允许您在特定条款和条件下,重新分配和 ... 
- poj 3101 Astronomy (java  分数的最小公倍数 gcd)
			题目链接 要用大数,看了别人的博客,用java写的. 题意:求n个运动周期不完全相同的天体在一条直线上的周期. 分析:两个星球周期为a,b.则相差半周的长度为a*b/(2*abs(a-b)),对于n个 ... 
- 函数buf_page_address_fold
			/********************************************************************//** Calculates a folded value ... 
- iOS开发:Swift多线程NSOperation的使用
			介绍: NSOperation是基于GCD实现,封装了一些更为简单实用的功能,因为GCD的线程生命周期是自动管理,所以NSOperation也是自动管理.NSOperation配合NSOperatio ... 
- UVa 12169 (枚举+扩展欧几里得) Disgruntled Judge
			题意: 给出四个数T, a, b, x1,按公式生成序列 xi = (a*xi-1 + b) % 10001 (2 ≤ i ≤ 2T) 给出T和奇数项xi,输出偶数项xi 分析: 最简单的办法就是直接 ... 
- ZJ2008树的统计(树链剖分)
			type node1=record go,next:longint;end; node2=record l,r,mx,sum:longint;end; var i,x,y,n,q,tmp,cnt,sz ... 
