![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
C++ 11/14
C++ 11/14
_Peko_
这个作者很懒,什么都没留下…
展开
-
【C++ 11/14 新特性】 其他杂项
其他杂项 新类型 long long int noexcept的修饰和操作 字面量 原始字符串字面量 自定义字面量 long long int long long int并不是 C++11 最先引入的,其实早在 C99,long long int就已经被纳入 C 标准中,所以大部分的编译器早已支持。C++11 的工作则是正式把它纳入标准库,规定了一...转载 2020-04-03 19:55:41 · 237 阅读 · 0 评论 -
【C++ 11/14 新特性】 对标准库的扩充: 语言级线程支持01
对标准库的扩充: 语言级线程支持 std::thread std::mutex/std::unique_lock std::future/std::packaged_task std::condition_variable提示:本节代码编译需要使用-pthread选项(链接库thread),例如:g++ main.cpp -std=c++14 -pthread...转载 2020-04-03 19:44:16 · 99 阅读 · 0 评论 -
【C++ 11/14 新特性】 正则表达式02 std::regex 及其相关
对字符串内容进行匹配的最常见手段就是使用正则表达式。可惜在传统 C++ 中正则表达式一直没有得到语言层面的支持,没有纳入标准库,而 C++ 作为一门高性能语言,在后台服务的开发中,对 URL 资源链接进行判断时,使用正则表达式也是工业界最为成熟的普遍做法。一般的解决方案就是使用boost的正则表达式库。而 C++11 正式将正则表达式的的处理方法纳入标准库的行列,从语言级上提供了标准的支持...转载 2020-04-03 18:16:59 · 746 阅读 · 0 评论 -
【C++ 11/14 新特性】 正则表达式01
对标准库的扩充: 正则表达式库 正则表达式简介 普通字符 特殊字符 限定符 std::regex及其相关 std::regex std::regex_match std::match_results转载 2020-04-02 20:29:10 · 177 阅读 · 0 评论 -
【C++ 11/14 新特性】 对标准库的扩充: 智能指针和引用计数02 std::shared_ptr 、std::unique_ptr、std::weak_ptr
std::shared_ptr std::shared_ptr是一种智能指针,它能够记录多少个shared_ptr共同指向一个对象,从而消除显示的调用delete,当引用计数变为零的时候就会将对象自动删除。但还不够,因为使用std::shared_ptr仍然需要使用new来调用,这使得代码出现了某种程度上的不对称。std::make_shared就能够用来消除显示...转载 2020-04-02 20:27:44 · 134 阅读 · 0 评论 -
【C++ 11/14 新特性】 对标准库的扩充: 智能指针和引用计数01 RAII 与引用计数
对标准库的扩充: 智能指针和引用计数 RAII 与引用计数 std::shared_ptr std::unique_ptr std::weak_ptr转载 2020-04-02 20:01:14 · 146 阅读 · 0 评论 -
【C++ 11/14 新特性】 对标准库的扩充: 新增容器04 元组 std::tuple
了解过 Python 的程序员应该知道元组的概念,纵观传统 C++ 中的容器,除了std::pair外,似乎没有现成的结构能够用来存放不同类型的数据(通常我们会自己定义结构)。但std::pair的缺陷是显而易见的,只能保存两个元素。 元组基本操作 关于元组的使用有三个核心的函数:std::make_tuple: 构造元组 std::get: 获得元组某个位置的值...转载 2020-04-02 19:59:28 · 200 阅读 · 0 评论 -
【C++ 11/14 新特性】 对标准库的扩充: 新增容器03 无序容器
我们已经熟知了传统 C++ 中的有序容器std::map/std::set,这些容器内部通过红黑树进行实现,插入和搜索的平均复杂度均为O(log(size))。在插入元素时候,会根据<操作符比较元素大小并判断元素是否相同,并选择合适的位置插入到容器中。当对这个容器中的元素进行遍历时,输出结果会按照<操作符的顺序来逐个遍历。而无序容器中的元素是不进行排序的,内部通过 Ha...转载 2020-04-02 19:39:34 · 97 阅读 · 0 评论 -
【C++ 11/14 新特性】 对标准库的扩充: 新增容器02 std::array 和 std::forward_list
std::array 看到这个容器的时候肯定会出现这样的问题:为什么要引入std::array而不是直接使用std::vector? 已经有了传统数组,为什么要用std::array?先回答第一个问题,std::vecotr太强大了,以至于我们没有必要为了去敲碎一个鸡蛋而用一个钉锤。使用std::array保存在栈内存中,相比堆内存中的std::vector,...转载 2020-04-02 19:25:26 · 212 阅读 · 0 评论 -
【C++ 11/14 新特性】 对标准库的扩充: 新增容器01
对标准库的扩充: 新增容器 std::array std::forward_list std::unordered_set std::unordered_map std::tuple 基本操作 运行期索引 合并与迭代转载 2020-04-02 19:12:09 · 158 阅读 · 0 评论 -
【C++ 11/14 新特性】 语言运行期的强化04 右值引用、std::move()
右值引用是 C++11 引入的与 Lambda 表达式齐名的重要特性之一。它的引入解决了 C++ 中大量的历史遗留问题,消除了诸如std::vector、std::string之类的额外开销,也才使得函数对象容器std::function成为了可能。 左值、右值的纯右值、将亡值、右值 要弄明白右值引用到底是怎么一回事,必须要对左值和右值做一个明确的理解。左值(lvalu...转载 2020-04-02 11:42:49 · 136 阅读 · 0 评论 -
【C++ 11/14 新特性】 语言运行期的强化03 函数对象包装器
这部分内容虽然属于标准库的一部分,但是从本质上来看,它却增强了 C++ 语言运行时的能力,这部分内容也相当重要,所以放到这里来进行介绍。 std::function Lambda 表达式的本质是一个函数对象,当 Lambda 表达式的捕获列表为空时,Lambda 表达式还能够作为一个函数指针进行传递,例如:#include <iostream>using fo...转载 2020-04-02 11:02:20 · 77 阅读 · 0 评论 -
【C++ 11/14 新特性】 语言运行期的强化01
lambda 表达式 lambda 表达式基础 值捕获 引用捕获 隐式捕获 表达式捕获 泛型 lambda 函数对象包装器 std::function std::bind/std::placeholder 右值引用 左值、右值的纯右值、将亡值、右值 右值引用和左值引用 移动语义 完美转发 ...转载 2020-04-01 22:18:35 · 81 阅读 · 0 评论 -
【C++ 11/14 新特性】 语言运行期的强化02 Lambda 表达式
Lambda 表达式是 C++ 11 中最重要的新特性之一,而 Lambda 表达式,实际上就是提供了一个类似匿名函数的特性,而匿名函数则是在需要一个函数,但是又不想费力去命名一个函数的情况下去使用的。这样的场景其实有很多很多,所以匿名函数几乎是现代编程语言的标配。 Lambda 表达式基础 [捕获列表](参数列表) mutable(可选) 异常属性 -> 返回类型 { ...转载 2020-04-01 22:28:56 · 134 阅读 · 0 评论 -
【C++ 11/14 新特性】 语言可用性的强化07 强类型枚举
在传统 C++ 中,枚举类型并非类型安全,枚举类型会被视作整数,则会让两种完全不同的枚举类型可以进行直接的比较(虽然编译器给出了检查,但并非所有),甚至枚举类型的枚举值名字不能相同,这不是我们希望看到的结果。C++ 11 引入了枚举类(enumaration class),并使用enum class的语法进行声明:enum class new_enum : unsigned int ...转载 2020-04-01 21:55:53 · 117 阅读 · 0 评论 -
【C++ 11/14 新特性】 语言可用性的强化06 面向对象增强
委托构造 C++ 11 引入了委托构造的概念,这使得构造函数可以在同一个类中一个构造函数调用另一个构造函数,从而达到简化代码的目的:class Base {public: int value1; int value2; Base() { value1 = 1; } Base(int value) : Base() { // ...转载 2020-04-01 21:49:26 · 81 阅读 · 0 评论 -
C++ 11/14 新特性】 语言可用性的强化04 区间迭代、初始化列表
区间迭代 int array[] = {1,2,3,4,5};for(auto &x : array) { std::cout << x << std::endl;}最常用的std::vector遍历将从原来的样子:std::vector<int> arr(5, 100);for(std::vector<int...转载 2020-04-01 20:19:44 · 137 阅读 · 0 评论 -
【C++ 11/14 新特性】 语言可用性的强化05 模板增强
外部模板 传统 C++ 中,模板只有在使用时才会被编译器实例化。换句话说,只要在每个编译单元(文件)中编译的代码中遇到了被完整定义的模板,都会实例化。这就产生了重复实例化而导致的编译时间的增加。并且,我们没有办法通知编译器不要触发模板实例化。C++11 引入了外部模板,扩充了原来的强制编译器在特定位置实例化模板的语法,使得能够显式的告诉编译器何时进行模板的实例化:template...转载 2020-04-01 21:15:49 · 124 阅读 · 0 评论 -
【C++ 11/14 新特性】 语言可用性的强化03 类型推导(auto、decltype )
在传统 C 和 C++中,参数的类型都必须明确定义,这其实对我们快速进行编码没有任何帮助,尤其是当我们面对一大堆复杂的模板类型时,必须明确的指出变量的类型才能进行后续的编码,这不仅拖慢我们的开发效率,也让代码变得又臭又长。C++ 11 引入了auto和decltype这两个关键字实现了类型推导,让编译器来操心变量的类型。这使得 C++ 也具有了和其他现代编程语言一样,某种意义上提供了无...转载 2020-04-01 10:08:37 · 133 阅读 · 0 评论 -
【C++ 11/14 新特性】 语言可用性的强化02 nullptr 与 constexpr
nullptr nullptr出现的目的是为了替代NULL。在某种意义上来说,传统 C++ 会把NULL、0视为同一种东西,这取决于编译器如何定义 NULL,有些编译器会将 NULL 定义为((void*)0),有些则会直接将其定义为0。C++ 不允许直接将void *隐式转换到其他类型,但如果NULL被定义为((void*)0),那么当编译char *ch ...转载 2020-04-01 09:53:26 · 172 阅读 · 0 评论 -
【C++ 11/14 新特性】 语言可用性的强化01
语言可用性的强化nullptr与constexpr 类型推导 auto decltype 尾返回类型、auto与decltype配合 区间迭代 基于范围的 for 循环 初始化列表 std::initializer_list 统一初始化语法 模板增强 外部模板 尖括号> 类型别名模板 变长参数模板 面向对象增强 委托...转载 2020-04-01 09:43:27 · 81 阅读 · 0 评论