C++11已不是新鲜技术,但对于我来说,工作中用得还不够多(前东家长时间使用gcc3.4.5,虽然去年升了4.8.2,但旧模块维护还是3.4.5居多;新东家用的是4.4.6,不能完整支持C++11,而且有内部有基础库早已支持了C++11 STL的部分功能),再加上自己的练习也写得少,了解仅是几点简单的皮毛,这里对C++11学习总结一番,期望对他人以及未来的我有点技术知识索引上的帮助。
     首先,wiki是最全面的:https://en.wikipedia.org/wiki/C%2B%2B11,这是C++完整的新功能,个人使用的编译器可能不完整支持,可以看这个编译器+版本对C++1X的支持情况:http://en.cppreference.com/w/cpp/compiler_support
     然后,看英文不够快,找一篇看起来比较全的中文总结(不全,还是要看wiki):http://www.cnblogs.com/pzhfei/archive/2013/03/02/CPP_new_feature.html

一、新特性简介

C++11之前被称为C++0x,因为原本计划在2010年发布,所以之前一些编译器使用C++11的编译参数是:-std=c++0x,后面使用:-std=c++11。C++11 设计的核心是:少改动语言,多改动基础库。
改动涉及到这几点:支持多线程编程(增加了thread库)、加强泛型编程(增加了hash容器、任意多个元素的tuple、bind函数、lambda函数)、统一初始化(以花括号调用构造函数)、性能(右值引用和move),其它stl库(正则表达式、原子操作库),另外还有一些语法糖的支持,如:default、delete定义(可以在派生类中delete掉基类的public函数),裸字符串的定义、类非静态成员变量直接赋值、nullptr、支持连续两个右尖括号、后置返回类型、Range-based的for循环、构造函数可以调用另一个构造函数、override关键字用于发现虚函数的覆盖错误、string literal.......。

二、部分常用新特性\库

挑选几个常用的记录如下

1、统一初始化

 之前,我想初始化一个放着map对象的容器,需要这样子:
std::vector<std::map<std::string, std::string> > a;
std::map<std::string, std::string> tmp;
tmp.insert(std::make_pair("", ""));
a.push_back(tmp);
现在,我可以直接用大括号:
std::vector<std::map<std::string, std::string>> a{ { { "", "" } } }
注: 部分统一初始化要到gcc4.7之后才支持。

2、函数绑定和lambda

函数绑定是基础库支持的,把一个函数转换为一个对象,在异步编程上用的很多(回调函数bind成一个对象,然后把对象交给异步工作完成的通知者,由它触发异步回调调用)。
lambda语法,则可以跟标准库的算法配合使用,或者跟bind一起用在异步编程上。
eg1: bind
class Work {
public:
void do_work() {
std::cout << "do work" << std::endl;
}
};
int main() {
Work work;
auto bar = std::bind(&Work::do_work, &work);
bar();
}
eg2:清除字符串中的'a'字符:
std::string tmp = "abcdefgdaaa";
tmp.erase(std::remove_if(tmp.begin(), tmp.end(), [](char x) {
return x == 'a';
}), tmp.end());
std::cout << tmp << std::endl;
lambda语法:
[capture](parameters)->return-type->{body}
[capture](parameters){body}
[] // 没有定义任何变量。使用未定义变量会导致错误。
[x, &y] // x 以传值方式传入(默认),y 以引用方式传入。
[&] // 任何被使用到的外部变量皆隐式地以引用方式加以使用。
[=] // 任何被使用到的外部变量皆隐式地以传值方式加以使用。
[&, x] // x 显示地以传值方式加以使用。其余变量以引用方式加以使用。
[=, &z] // z 显示地以引用方式加以使用。其余变量以传值方式加以使用。
注:lambda需要gcc4.5之后才支持

3、直接给类成员变量设置默认值

Non-static data member initializers
eg:
class A {
public:
A () {}
explicit A(int new_value) : value(new_value) {} int get() {
return value;
}
private:
int value = ; // 支持直接写默认值
};
注:至少需要gcc4.7

4、新增tuple类型

tuple类型在传输多种类型组成的数据时,可以省去定义struct,而且可以有任意多的成员。
eg:
std::tuple<std::string, std::string, std::string, int, int> record = std::make_tuple("a", "b", "c", , );
std::cout << std::get<>(record) << std::endl;
std::cout << std::get<>(record) << std::endl;
gcc4.4对tuple的支持不够完整(不用使用const 字符赋值给string),需要gcc4.7以上才完善。

5、新增hash表

std::unordered_set
std::unordered_multiset
std::unordered_map
std::unordered_multimap
查找性能比set、map的要快。

6、新增多线程支持

std::thread
std::async
std::promise,std::future,
要特别说明下promise、future的概念:
“主线程创建一个promise,将与promise关联的future交给新的线程,新线程等待从promise获取数据,主线程通过promise向期望设置值,新线程收到通知继续往下走。”
这说明,promise/future是用于异步编程时,线程之间的同步的,有点像多线程编程下的event通知。
eg:
#include <iostream>
#include <functional>
#include <thread>
#include <future>
void show(std::future<int>& fut) {
std::cout << "work thread:" << std::this_thread::get_id() << std::endl;
int x = fut.get(); // 等待获取到结果
std::cout << x << std::endl;
}
int main(){
std::cout << "main thread:" << std::this_thread::get_id() << std::endl;
std::promise<int> promise;
std::future<int> future = promise.get_future();
std::thread work_thread(show, std::ref(future));
std::this_thread::sleep_for(std::chrono::seconds());
promise.set_value();
work_thread.join();
return ;
}
注:promise/future至少需要gcc4.7才支持
扩展说明: 从上面的例子可以看到,标准库的promise/future不支持设置回调函数,需要自己通过get函数等待,这是异步调用者(主线程)主动的在等待通知,不像js可以通过.then函数设置回调通知函数,调用者可以被动的被调用。所以,当前不能做到彻底的异步编程(一个回调后面继续跟着回调)。但.then 函数已经在规划中,参见:
"With .then, instead of waiting for the result, a continuation is “attached” to the asynchronous operation, which is invoked when the result is ready. "
"do this, and when it is done, then do this, and when it is done, then do this..."
有then函数的好处是,我们的代码可以实现彻底的异步,以上面的例子为例,我只要告诉future回调函数是xx,主线程就不用再等待,它可以去做别的,当工作完成的时候,工作线程主动的去触发回调函数xx的调用。
另外,boost已经有then的功能,
#include <iostream>
#include <string> #define BOOST_THREAD_PROVIDES_FUTURE
#define BOOST_THREAD_PROVIDES_FUTURE_CONTINUATION #include <boost/thread/future.hpp> using namespace boost; int main() {
future<int> f1 = async([]() { return ; });
future<std::string> f2 = f1.then([](future<int> f) {
std::cout << f.get() << std::endl; // here .get() won't block
return std::string("sgfsdfs");
});
}
部分公司使用boost,或者从boost里借鉴future.then()的实现造了一个基础库,就可以在代码中实现 : do this, and when it is done, then do this, and when it is done, then do this ....

7、其它

(1)可以定义一个无需转义的字符串,如:std::string b = R"x(c:\abc)" yy l)x";
其中x(是一个标识符,x可以任意,最长16个字符。
注意:Raw string literals至少需要gcc4.4
(2)正则表达式库
(3)构造函数委托
(4)std::shared_ptr 智能指针
(5)railing-return-type 后置返回类型
 
本文所在:http://www.cnblogs.com/cswuyg/p/6220671.html
 
学习参考:
 

使用C++11的一点总结的更多相关文章

  1. C++11用于计算函数对象返回类型的统一方法

    [C++11用于计算函数对象返回类型的统一方法] 模板 std::result_of 被TR1 引进且被 C++11 所采纳,可允许我们决定和使用一个仿函数其回返值的类别.底下,CalculusVer ...

  2. Tips

    1)字符串转换数字 ') { ; do{ j*=;j+='); i++; }'); //实际上为读入优化的一部分 2)进制转换万能模板 #include <cstdio> using na ...

  3. Protocol Buffer技术详解(C++实例)

    Protocol Buffer技术详解(C++实例) 这篇Blog仍然是以Google的官方文档为主线,代码实例则完全取自于我们正在开发的一个Demo项目,通过前一段时间的尝试,感觉这种结合的方式比较 ...

  4. phpMyAdmin安装设置

    phpMyAdmin是一种MySQL的管理工具,它直接从web上去管理MySQL.   假设你的web(网页存放)根目录是 /var/www/ 假设你的主机web访问是这样的 http://192.1 ...

  5. 关于fork( )函数父子进程返回值的问题

    fork()是linux的系统调用函数sys_fork()的提供给用户的接口函数,fork()函数会实现对中断int 0x80的调用过程并把调用结果返回给用户程序. fork()的函数定义是在init ...

  6. emouse思·睿—评论与观点整理之三

    虽说我主要做的硬件,平时的兴趣爱好比较关注移动互联网,混迹于虎嗅.爱范儿.雷锋网.36Kr.cnBeta.瘾科技.i黑马.TechWeb等这类科技以及创业媒体,遗憾的是系统的去写的并不多,好在还算充分 ...

  7. APS审核经验+审核资料汇总——计算机科学与技术专业上海德语审核

    1.APS是什么 德国驻华使馆文化处留德人员审核部(简称APS)成立于2001年7月,是由德国驻华使馆文化处和德意志学术交流中心(DAAD)在北京共同合作成立的服务机构. APS是中国学生前往德国留学 ...

  8. 地区sql

    /*Navicat MySQL Data Transfer Source Server : localhostSource Server Version : 50136Source Host : lo ...

  9. Element-UI 2.4.11 版本 使用注意(发现一点更新一点)

    1.$Vue.$refs.addForm.resetFields() 的resetFields()方法重置到默认值并不是 ,你在form绑定对象上写的默认值 ,而是这个form被渲染出来之后第一次赋到 ...

随机推荐

  1. MySQL字段类型详解

    MySQL支持大量的列类型,它可以被分为3类:数字类型.日期和时间类型以及字符串(字符)类型.本节首先给出可用类型的一个概述,并且总结每个列类型的存储需求,然后提供每个类中的类型性质的更详细的描述. ...

  2. 在Ubuntu14.04安装torch7笔记

    http://www.linuxdiyf.com/linux/18979.html 附编译例子: https://github.com/vic-w/torch-practice

  3. #听云博客大赛#如何在自己的App嵌入听云产品监控App性能

    近日浏览园子文章的时候,发现博客园与听云正在举办“听云原创博文”大赛.最近手上正好正在开发一款iOS的应用,所以就用听云App来监测一下我的App各个指标,为我的应用保驾护航.下面,我就从头到尾演示下 ...

  4. angular的promise理解

    promise承诺是angular的一个重点部分,是一种异步处理值(或非值)的方法.一般程序是从上至下执行,遇到某个地方需要花点时间,就干等着把这个地方执行完了,才继续做下一个,看着有点笨蛋.而pro ...

  5. 20161106PM-接口

    使用网址:http://apistore.baidu.com apikey:1f1d014aee0adeddbe33a6e1f55f7925 Composer GET http://apis.baid ...

  6. html5悬浮球效果

    自己想做一个自己的网站,觉得自适应的效果会好一点,但是放到手机端的话,菜单显示是个问题.所以自己试着写了一个悬浮球菜单的效果. 好了,上代码. 这里有四个文件要用: jqurey.js//因为基于jq ...

  7. Java开发中经典的小实例-(冒泡法)

    public class Test25 {    public static void main(String[] args) {        // 冒泡法        int[] array = ...

  8. Oracle创建数据库

    Oracle创建数据库有三种方式:一.使用DBCA(Database Configuration Assistant 数据库配置助手):二.使用 create database指令:三.在安装数据库软 ...

  9. Spire.Office组件使用例子

    用.NET开发程序通常要涉及到对Office文件读写操作,比较常见的操作比如提取文本,导出Excel格式数据,动态生成word文档,生成pdf文档等. 实现这些功能通常需要在服务端安装office软件 ...

  10. 利用CSS制作三角形

    在我们看到类似于这样的图片时: 我们一般都会想,哎,这还不简单,用一张图片就可以了. 的确,用图片可以很轻松地做到.不过我们接下来要讨论的是: 如何用css也作出这样的效果.   首先,我们来定义一个 ...