作者简介: 肖攀, 腾讯高级工程师。
最近开始使用C++11编码,编码效率和代码质量提升不少,把目前我遇到的提升效率和代码质量的新特性都总结一下。(备注:这里不会列出所有的C++11新特性,只会列出我编码过程中实际用到的新特性)
一、auto关键字,这个关键字作用类似js里的var,可以自动判断变量类型。在实际编码中,这个变量真的可以省很多代码,比如:
std::map<std::string, std::set<std::string>> x = return_x();//return_x
是一个返回std::map<std::string, std::set<std::string>>
变量的函数。
特别的,当for
循环std::map<std::string, std::set<std::string>>
这个变量的时候,要写一个迭代器,但是定义std::map<std::string, std::set<std::string>>::iterator it
,一行代码就被占了一半了,吐血。换成auto
,代码就少多了。
二、for
循环,支持for(x: xxx)
这种模式了,其中xxx是一个支持迭代器的集合,x是xxx中的一个元素,配合auto
关键字,for
循环的代码就清爽多了:
之前:
for (std::map<std::string, std::set<std::string>>::iterator it = xxx.begin(); it != xxx.end(); it++) {}
现在:
for (auto x : xxx) {}
三、在定义类成员变量的时候初始化。比如:
class X
{
int x = 0;
}
这个特性看起来貌似没啥用,但是实际用起来才发现可以少写很多代码,想想每增加一个成员变量,都要去构造函数初始化列表里添一点东西就烦。
四、thread库,之前stl没有提供标准的线程库,要么裸用系统提供的,要么自己封装一下。现在stl提供了,而且非常简洁,如下:
(这里借用一下lamda函数)
std::thread t([](){ std::cout << "hello world!" << std::endl;})
一个用子线程t运行打印hello world!的功能就完成了。
五、lambda函数,就是匿名函数,看各种介绍说很牛B的样子,不过目前我用的很少,应该是在foreach
这类函数里用比较好。或者可以用来实现boost里scope_exit
的特性。
六、chrono,stl里新提供了chrono类,这个类主要提供两个功能,时间点(timepoint)和时间段(duration)功能,由duration衍生出nanoseconds,microseconds,milliseconds等时间单位,并且提供他们的加减和换算功能。把我们在看代码时,从一个整型到底是一个时间点还是一个时间段的纠结里解放出来。另外,chrono提供了steady_colock和system_clock两个时钟,一个用来单调递增,一个用来表示系统时间,也方便了不少。
目前用到的主要就这六个地方,后续有觉得新的好特性再继续总结。(PS:tlinux2.0上4.8的gcc编译器,在chrono的实现里有一个bug,std::chrono::duration::max
本意是系统能提供的最长时间段,但是在gcc的实现里,这里溢出了,变成了负数,所以意思就变成类似std::chrono::duration::min
的作用,用的时候需要注意下绕过这个坑)
本文系转载,如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,如有侵权,请联系 cloudcommunity@tencent.com 删除。