10 2017 档案
摘要:1、shared_ptr共享智能指针 std::shared_ptr使用引用计数,每个shared_ptr的拷贝都指向相同的内存,在最后一个shared_ptr析构的时候,内存才会释放。 1.1 基本用法 1.1.1 初始化 shared_ptr可以通过make_shared来初始化,也可以通过sh
阅读全文
摘要:1、emplace_back减少内存拷贝和移动 emplace_back能通过参数构造对象,不需要拷贝或者移动内存,相比pusk_back能更好的避免内存的拷贝和移动,使容器插入元素性能得到进一步提升。几乎所有的标准库容器都增加了类型的方法:emplace,emplace_hint,emplace_
阅读全文
摘要:1、move C++11中可以将左值强制转换为右值,从而避免对象的拷贝来提升性能。move将对象的状态或者所有权从一个对象转移到另一个对象,没有内存拷贝。深拷贝和move的区别如图: 从图可以看出,深拷贝会有两份内存,而move只有一份,move只是将内存的所有者切换为目标对象,并没有移动任何东西,
阅读全文
摘要:1、左值与右值 C++11中新增了一种类型,右值引用,标记为T &&。 首先来介绍什么是左值和右值,左值是指表达式结束后依旧存在的持久对象,而右值是指表达式结束之后就不再存在的临时对象。一个区分左值与右值的简单方法就是: 能不能对表达式取值,如果能,则是左值,否则为右值。所有具名变量或对象都是左值,
阅读全文
摘要:tuple元组是一个固定大小不同类型的值的集合,是泛化的std::pair。我们也可以把它当作一个通用的结构体来使用,不需要创建结构体有获取结构体特征,在某些情况可以取代结构体,使程序更简洁、直观。 tuple在C++11中使用简单,但是往往要和模板元的一些技巧结合使用。 这个tuple等同于结构体
阅读全文
摘要:1、 定义 lambda表达式是C++11非常重要也是很常用的特性之一,来源于函数式编程的概念,也是现代编程语言的一个特点。它有如下特点: 声明式编程风格:就地匿名定义目标函数或者函数,不需要额外写一个命名函数或者函数对象,以更直接的方式写程序。 简洁:不需要额外再写一个函数或者函数对象,避免了代码
阅读全文
摘要:1、 可调用对象 在C++中,有“可调用对象”这么个概念,那么什么是调用对象呢?有哪些情况?我们来看看: 函数指针; 具有operator()成员函数的类对象(仿函数); 可以被转换为函数指针的类对象; 类成员(函数)指针。 我们来看代码: 上述的对象都是可调用对象,这些对象的类型统称为“可调用类型
阅读全文
摘要:1、 for循环的新用法 在C++98/03中,通过for循环对一个容器进行遍历,一般有两种方法,常规的for循环,或者使用<algorithm>中的for_each方法。 for循环遍历: for_each方法: for_each相比一般的for循环,只需关注容器元素的类型,但是都是基于范围的循环
阅读全文
摘要:1、 C++98/03初始化 我们先来总结一下C++98/03的各种不同的初始化情况: 这些不同的初始化方法都有各自的适用范围和方法,但是种类繁多的方法却没有一种可以通用的。所以C++11提出了初始化列表的方法来解决通用问题。 2、 统一初始化方法 其实C++98/03中已经存在初始化列表的方法,只
阅读全文
摘要:1、 右尖括号 我们在C++98/03中使用泛型编程的时候,经常遇到“>>”被当作右移操作符,而不是模板参数的结尾。假如我们有如下代码: 使用C++98/03的时候会出现如下错误: 意思就是vector<Foo<int>>的写法不支持,我们不得不改成vector<Foo<int> >,”>>”之间有
阅读全文
摘要:1、 概述 C++11里面引入了auto和decltype关键字来实现类型推导,通过这两个关键字不仅能方便的获取复杂的类型,还能简化书写,提高编码效率。 2、 auto 2.1 auto关键字的新定义 auto关键字并不是一个全新的关键字,早在旧标准中就已经有定义:“具有自动储存期的局部变量”,不过
阅读全文