点击上方蓝字关注我,置顶更快接收消息!
学习SLAM,C++编程是必备技能。不过,大家在学校里学习的书本一般比较老,主要还是C++98那些老一套。
本文所谓的C++新特性是指C++11及其以后的C++14、C++17增加的新关键字和新语法特性。其中C++11是C++98以来最重要的一次变化,而其后的C++14、C++17是在该基础上的完善和补充。
那么,问题来了,如果我不想学习新特性,还是像以前那样编程可以吗?
答案是:可以,不过这就像是别人已经在用铁制刀具切瓜了,你还在石器时代使用石头刀具,你说,效率能一样吗?
看看下面你心里就有答案了。
为何要学习新特性?
1、可以大幅度提高编程效率,切瓜更6
C++新特性增加了很多非常高效的关键字和语法,比如std::swap,C++11之前的swap执行了三次内存拷贝操作,这种不必要的内存操作会影响效率。而C++11之后的swap引入了右值引用和数据移动的概念,使用内存移管代替了不必要的内存拷贝,大大提高了效率。
2、省心省力,减少脱发
举个栗子。C++11之前如果我们要定义并初始化一个新变量,必须得知道其类型并定义,这在很多时候是非常繁琐的,比如迭代器的使用,而C++11之后引入了自动类型推导,一个auto解决一切,不需要关心类型,编译器会帮你自动推导出类型。
3、能看懂别人的代码,不被新时代抛弃
由于上述的优点,很多开源代码都是使用C++新特性,工作学习中大家也都使用新特性,如果你根本不了解这些新特性,估计很难看懂别人的代码,时代的战车会轰隆隆把你抛弃。
下面就列举几个比较典型的、经常使用的新特性,供大家入门。
常用的C++新特性
C++11前只有数组能使用初始化列表。而C++11后大部分类型都可以初始化列表,方便的很。如下所示。
C++11中引入了auto,可以用来进行自动类型推导,不用关心数据类型,编译器会帮你推导好,而且这种方式也不影响编译速度。
比如迭代器使用了自动类型推导后,感觉清爽多了,如下图所示:
不过,auto使用时也有需要注意的地方:
比如auto不能代表一个实际的类型声明,auto声明的变量必须马上初始化
见下图:
更多内容可以网上查询,如果懒得找可以参考:
https://blog.csdn.net/m_buddy/article/details/72828576
for循环是使用频率非常高的循环方式,在新特性里我们不需要再像以前那样每次都使用自增或者自减的方式来索引了,结合前面介绍的auto,我们可以极大简化循环方式,如下图所示:
而且这种循环支持大部分数据类型,比如数组,容器,字符串,迭代器等等。
lambda表达式可以使得编程非常简洁,尤其适用于简单的函数,一般形式如下:
[函数对象参数](操作符重载函数参数)->返回值类型{函数体}
下面是几个例子及解释:
在Python和MATLAB中可以非常方便的使用可以变长的参数,C++11以后引入了tuple,可以实现类似功能,并且可以传入多个不同类型的数据,如下图所示
除了上述介绍的常用的几种新特性外,还有很多新特性,比如:
decltype:像auto的反函数,可以从一个变量或表达式中得到类型;
nullptr:解决原来C++中NULL的二义性问题;
STL容器、智能指针、多线程相关的新特性
可以在网上查到很多资料,如果懒得找,可以看看下面两个链接。
https://www.cnblogs.com/feng-sc/p/5710724.html
http://towriting.com/blog/2013/08/01/what-is-cpp11/文末知识星球里也有相关的电子书和视频讲解。
练习题
请使用C++新特性改写以下函数。该函数功能:将一组无序的坐标按照“Z”字形排序,并输出。
本程序学习目标:
熟悉C++新特性(简化循环、自动类型推导、列表初始化、lambda函数)
题目:
正确输出结果:
如果想要下载以上代码框架,在公众号菜单栏回复:11,即可。
欢迎留言讨论,更多学习视频、文档资料、参考答案等扫描下方二维码进入知识星球「从零开始学习SLAM」和其他学习SLAM学的伙伴一起学习交流~
相关阅读