C++11新特性使用总结

作者简介: 肖攀, 腾讯高级工程师。

最近开始使用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的作用,用的时候需要注意下绕过这个坑)

原文链接:

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏静晴轩

你所不知道的setTimeout

JavaScript提供定时执行代码的功能,叫做定时器(timer),主要由setTimeout()和setInterval()这两个函数来完成。它们向任务队列...

40612
来自专栏Vamei实验室

Python深入06 Python的内存管理

语言的内存管理是语言设计的一个重要方面。它是决定语言性能的重要因素。无论是C语言的手工管理,还是Java的垃圾回收,都成为语言最重要的特征。这里以Python语...

2059
来自专栏草根专栏

.NET Core TDD 前传: 编写易于测试的代码 -- 构建对象

本文是第2篇, 介绍的是如何避免在构建对象时写出不易测试的代码. 本文的概念性内容大部分都来自Misko Hevery的这篇博客文章.

922
来自专栏coding

vue.js组件初探

一个页面的ui可以切割成由不同的组件构成,这些组件毕竟独立,这样拆分的好处在于可以做到如同堆积木般快速将页面搭建及重构

742
来自专栏岑玉海

Carbondata源码系列(二)文件格式详解

在上一章当中,写了文件的生成过程。这一章主要讲解文件格式(V3版本)的具体细节。 1、字典文件格式详解 字典文件的作用是在存储的时候将字符串等类型转换为int类...

4206
来自专栏谢易成的专栏

Vue服务端渲染之cookie,user-agent获取

Vue服务端渲染有个参数runInNewContext,之前我们这个参数一直设置为true,这样可以全局获取到直出的context。

2902
来自专栏iOS开发攻城狮的集散地

浅谈iOS内存管理机制

1999
来自专栏微信公众号:Java团长

Java集合框架综述

最近打算复习复习JDK中的集合框架,并尝试分析其源码,这么做一方面是这些类非常实用,掌握其实现能更好的优化我们的程序;另一方面是学习借鉴JDK是如何实现了这么一...

783
来自专栏闻道于事

设计模式之装饰器设计模式

Java的IO流使用了一种装饰器设计模式。它将IO流分成底层节点流和上层处理流,其中节点流用于和底层的物流存储结点直接关联——不同的物流节点获取该结点流的方式可...

983
来自专栏互联网杂技

React数据流和组件间的通信总结

首先,我认为使用React的最大好处在于:功能组件化,遵守前端可维护的原则。 先介绍单向数据流吧。 React单向数据流:   React是单向数据流,数据主要...

3457

扫码关注云+社区