
C++11新特性
文章平均质量分 73
C++11包含了核心语言的新机能,并且拓展C++标准程序库,并且加入了大部分的C++ Technical Report 1程序库(数学上的特殊函数除外)
草上爬
专注技术,热爱分享
展开
-
C++11的重大改变
自从C++语言第一次迭代已经过去13年。C++标准委员会成员Danny Kalev在本文中解释了这门编程语言有怎样的改进,以及如何帮助你编写更好的代码。C++的发明者Bjarne Stroustrup最近说,C++11“感觉就像是一个新的语言——各部分之间能够更好的协作”。事实上,核心C++11已经有了很大的改变。现在它支持lambda表达式,自动类型推断,统一的初始化语法,委托构造函数,已删原创 2016-04-06 15:32:14 · 4223 阅读 · 2 评论 -
C++11新特性之一:auto
C++是一门伟大的语言,永远给程序员最大的设计自由, 未使用的特性从不产生副作用,新版本永远完全兼容旧版本。 C++11先前被称作C++0x,即ISO/IEC 14882:2011,是C++编程语言的一个标准。之前的C++标准包括C++98、C++03。 虽然此后的[C++14]才是C++的现行标准,但C++14旨在对C++11的小扩展(漏洞修复、功能改进),而C++11仍然是一个具有热度原创 2018-01-23 14:43:44 · 2343 阅读 · 0 评论 -
C++11新特性之二:decltype
decltype与auto关键字一样,用于进行编译时类型推导。decltype实际上有点像auto的反函数,auto可以让你声明一个变量,而decltype则可以从一个变量或表达式中得到类型,例如:int x = 3; decltype(x) y = x; 有人会问,decltype的实用之处在哪里呢,假如有一个加工产品的函数模板:template void proc原创 2018-01-22 16:46:47 · 11120 阅读 · 0 评论 -
C++11新特性之三:nullptr
熟悉C++的童鞋都知道,为了避免“野指针”(即指针在首次使用之前没有进行初始化)的出现,我们声明一个指针后最好马上对其进行初始化操作。如果暂时不明确该指针指向哪个变量,则需要赋予NULL值。除了NULL之外,C++11新标准中又引入了nullptr来声明一个“空指针”,这样,我们就有下面三种方法来获取一个“空指针”,如下:int *p1 = NULL; int *p2 = 0;int *p原创 2018-01-23 10:03:55 · 2416 阅读 · 1 评论 -
C++11新特性之四:range-based for loops
熟悉C++98/03的对于for循环就再了解不过了,如果我们要遍历一个数组,那么在C++98/03中的实现方式:int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; for (int i = 0; i < 10; i++) cout 而遍历容器类的For如下:std::vector vec {1,2,3,4,5,6,7,8,9,1原创 2018-01-23 11:10:45 · 2504 阅读 · 0 评论 -
C++11新特性之五:Lambda
C++11的一大亮点就是引入了Lambda表达式。利用Lambda表达式,可以方便的定义和创建匿名函数。对于C++这门语言来说来说,“Lambda表达式”或“匿名函数”这些概念听起来好像很深奥,但很多高级语言在很早以前就已经提供了Lambda表达式的功能,如C#,Python等。今天,我们就来简单介绍一下C++中Lambda表达式的简单使用。声明Lambda表达式Lambda表达式完整的声明格式如...原创 2018-01-23 13:36:29 · 2269 阅读 · 0 评论 -
C++11新特性之六:list-initialization
在我们实际编程中,我们经常会碰到变量初始化的问题,对于不同的变量初始化的手段多种多样,比如说对于一个数组我们可以使用 int arr[] = {1,2,3}的方式初始化,又比如对于一个简单的结构体:[cpp]view plaincopystructA{intx;inty;}a={1,2原创 2018-01-26 11:44:30 · 5258 阅读 · 2 评论 -
C++11新特性之七:bind和function
一.std::bindbind是这样一种机制,它可以将参数绑定于可调用对象,产生一个新的可调用实体,这种机制在函数回调时颇为有用。C++98中,有两个函数bind1st和bind2nd,它们分别用来绑定functor的第一个和第二个参数,都只能绑定一个参数。C++98提供的这些特性已经由于C++11的到来而过时,由于各种限制,我们经常使用bind而非bind1st和bind2nd。在C++11原创 2018-01-26 19:52:00 · 7963 阅读 · 0 评论 -
C++11新特性之八:smart pointers
一.智能指针的作用C++程序设计中使用堆内存是非常频繁的操作,堆内存的申请和释放都由程序员自己管理。程序员自己管理堆内存可以提高了程序的效率,但是整体来说堆内存的管理是麻烦的,C++11中引入了智能指针的概念,方便管理堆内存。使用普通指针,容易造成堆内存泄露(忘记释放),二次释放,程序发生异常时内存泄露等问题等,使用智能指针能更好的管理堆内存。理解智能指针需要从下面三个层次:1.从较浅的层面看,智...原创 2018-01-26 20:41:14 · 2102 阅读 · 2 评论 -
C++11新特性之九:strongly-typed enums
一.传统枚举类型的缺点1.作用域冲突传统C++中枚举元素被暴漏在外层作用域中,这样若是同一作用域下有两个不同的枚举类型,但含有相同的枚举元素,就会产生冲突。enum EnumOne{ A = 1, B = 2};enum EnumTwo{ A = 1, C = 2};error C2365: “A”: 重定义;以前的定义是“枚举数”2原创 2018-01-27 18:15:59 · 2127 阅读 · 0 评论 -
C++11新特性之十:enable_shared_from_this
enable_shared_from_this是一个模板类,定义于头文件<memory>,其原型为:template< class T > class enable_shared_from_this; std::enable_shared_from_this 能让一个对象(假设其名为 t ,且已被一个 std::shared_ptr 对象 pt 管...原创 2018-02-27 20:43:06 · 101445 阅读 · 21 评论 -
C++11新特性之十一:emplace
emplace操作是C++11新特性,新引入的的三个成员emlace_front、empace 和 emplace_back,这些操作构造而不是拷贝元素到容器中,这些操作分别对应push_front、insert 和push_back,允许我们将元素放在容器头部、一个指定的位置和容器尾部。两者的区别当调用insert时,我们将元素类型的对象传递给insert,元素的对象被拷贝到容器中,而当我们使...原创 2018-05-21 12:22:21 · 7633 阅读 · 0 评论 -
C++11新特性之十二:std::all_of, std::any_of, std::none_of
检测在范围[first,last)内是否所有元素都不满足条件,如果所有元素都不满足条件,返回true,否则返回false,当范围[first,last)为空时(无元素),返回true。检测在范围[first,last)内是否所有元素都满足条件,如果所有元素都满足条件,返回true,否则返回false,当范围[first,last)为空时(无元素),返回true。.........原创 2017-11-15 15:30:14 · 6747 阅读 · 0 评论 -
C++11新特性之十三:std::make_unique和std::make_shared
相比于直接使用new,make函数可以消除代码重复,提高异常安全,而且和生成的代码更小更快。不适合使用make函数的场合包括需要指定自定义删除器和想要传递大括号初始值。对于,使用make函数可能是不明智的额外场合包括(1)自定义内存管理函数的类和(2)内存紧张的系统中,有非常大的对象,然后比长寿。原创 2018-01-27 10:46:42 · 17245 阅读 · 0 评论 -
C++11新特性之十四:std::async
如果f与调用std::async的线程并发执行(即,使用std::launch::async发射策略),这里就没有问题(假设f能结束执行,不会一直死循环)。可能很奇怪,std::async的默认发射策略——它的默认策略是你不能显式指定的——不是两者其中的一种,相反,是两者进行或运算。比起基于线程编程,基于任务的设计能分担你的线程管理之痛,而且它提供了一种很自然的方式,让你检查异步执行函数的结果(即,返回值或异常)。因此,如果异步执行是必需的,指定std::launch::async发射策略。原创 2018-01-27 12:41:14 · 2362 阅读 · 0 评论 -
C++11新特性之十五:std::atomic
在以往的C++标准中并没有对原子操作进行规定,在新标准C++11,引入了原子操作的概念,并通过头文件#include 提供了多种原子操作数据类型,这些类型上的所有操作都是原子的。如果我们在多个线程中对这些类型的共享资源进行操作,编译器将保证这些操作都是原子性的,也就是说,确保任意时刻只有一个线程对这个资源进行访问,编译器将保证,多个线程访问这个共享资源的正确性。从而避免了锁的使用,提高了效率。原创 2016-06-19 16:00:25 · 4250 阅读 · 0 评论 -
C++11新特性之十六:std::tie
为生成pair, c++ 提供了make_pair的快捷操作,相应的,对tuple也提供了make_tuple用于快速创建tuple对象。在c++ 11标准库中,加入了std::tie,在c++ 14中改进,方便使用。其与std::tuple关系密切, 主要目的是方便地使用std::tuple。元组std::tuple可以将不同类型的元素存放在一起,可以理解为std::pair的扩展(pair只能包含两个元素,而tuple可以多个)。因此,std::tie可以用于pair的解包。原创 2023-10-24 01:03:08 · 3300 阅读 · 1 评论 -
C++11新特性之十七:constexpr
constexpr是在 C++11 被引进的关键字,它的字面意思是 constant expression,常量表达式。它可以作用在变量和函数上。在C++11之后的标准中赋予了constexpr更多的特性,比如C++14 允许在 constexpr 函数中使用局部变量,从而支持了循环;constexpr修饰的函数,简单的来说,如果其传入的参数可以在编译时期计算出来,那么这个函数就会产生编译时期的值。但是,传入的参数如果不能在编译时期计算出来,那么constexpr修饰的函数就和普通函数一样了。原创 2016-10-26 10:57:53 · 8459 阅读 · 1 评论 -
C++11新特性之十八:正则表达式
正则表达式不是 C++ 语言的一部分,这里仅做简单的介绍。正则表达式描述了一种字符串匹配的模式。一般使用正则表达式主要是实现下面三个需求:●检查一个串是否包含某种形式的子串;●将匹配的子串替换;●从某个串中取出符合条件的子串。正则表达式是由普通字符(例如 a 到 z)以及特殊字符组成的文字模式。模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。原创 2016-10-14 11:54:09 · 6808 阅读 · 0 评论 -
C++11并发学习之一:小试牛刀
1.与C++11多线程相关的头文件C++11 新标准中引入了四个头文件来支持多线程编程,他们分别是 ,,,和。:该头文主要声明了两个类, std::atomic和std::atomic_flag,另外还声明了一套C风格的原子类型和与C兼容的原子操作的函数。:该头文件主要声明了 std::thread 类,另外 std::this_thread 命名空间也在该头文件中。:原创 2016-10-16 14:17:42 · 2585 阅读 · 0 评论 -
C++11并发学习之二:线程管理
也就是说,如果进程的main函数返回或者任何线程调用了exit, 整个进程就终止,其中包括它的任何线程。2.当使用detach()函数时,主调线程继续运行,被调线程驻留后台运行,主调线程无法再取得该被调线程的控制权。当主调线程结束时,由运行时库负责清理与被调线程相关的资源。在声明一个std::thread对象之后,都可以使用detach和join函数来启动被调线程,区别在于两者是否阻塞主调线程。1.当使用join()函数时,主调线程阻塞,等待被调线程终止,然后主调线程回收被调线程资源,并继续运行;原创 2016-10-16 19:39:14 · 2628 阅读 · 1 评论 -
C++11并发学习之三:线程同步
1. 头文件介绍Mutex又称互斥量,C++ 11中与 Mutex 相关的类(包括锁类型)和函数都声明在 头文件中,所以如果你需要使用 std::mutex,就必须包含 头文件。(1)Mutex系列类(四种)std::mutex,最基本的 Mutex 类。std::recursive_mutex,递归 Mutex 类。std::time_mutex,定时 Mutex 类。原创 2016-10-17 22:44:12 · 5679 阅读 · 0 评论 -
C++11并发学习之四:线程同步(续)
有时候,在第一个线程完成前,可能需要等待另一个线程执行完成。C++标准库提供了一些工具可用于这种同步操作,形式上表现为条件变量(condition variables)和期望(futures)。一.条件变量C++标准库对条件变量有两套实现:std::condition_variable和std::condition_variable_any。这两个实现都包含在 头文件的声明中。两者都需要与原创 2016-10-20 23:11:22 · 2950 阅读 · 0 评论 -
C++11并发学习之五:生产者与消费者
本文将实现单生产者-多消费者模型、多生产者-单消费者模型和多生产者-多消费者模型。前两种实际上是简化版的多生产者-多消费者,因此只需要实现第三种。中实际上用条件变量实现了一个简单的单生产者-单消费者模型,也就是一个生产者和一个消费者。原创 2016-11-15 22:43:14 · 3649 阅读 · 3 评论 -
C++11并发学习之六:线程池的实现
首先感谢github上大神的分享:https://github.com/progschj/ThreadPool代码非常的见解,只有一个头文件ThreadPool.h,这里贴出来作为备份。#ifndef THREAD_POOL_H#define THREAD_POOL_H#include <vector>#include <queue>#include <me...原创 2018-05-19 15:31:15 · 29858 阅读 · 18 评论