浅析C++11新特性
文章平均质量分 59
C++11包含了核心语言的新机能,并且拓展C++标准程序库,并且加入了大部分的C++ Technical Report 1程序库(数学上的特殊函数除外)。
一苇渡江694
无有功德,一苇渡江
展开
-
C++11和Boost库
C++11标准中引入了很多Boost库中的东西,对于所有人来说,完全可以使用C++11来替代之前使用的boost库。但是还有一些事项需要我们注意。发现了一篇好文,出处: https://meetingcpp.com/index.php/br/items/c11-and-boost.htmlSome parts of the Standard Library in C++11 are predate原创 2016-02-22 19:39:46 · 10918 阅读 · 3 评论 -
C++11新特性应用--介绍几个新增的便利算法(关于最大值和最小值的算法)
工作中往往有这样的场景:选出一个容器,或是范围内的最大值、最大元素、最小值和最小元素。很普通的做法就是,我们用一个for循环进行遍历,然后达到我们的效果。其实stl的算法中就提供了一些关于最大和最小的操作,我们往往忽略他们。这篇博客也是关于C++11中新增加的算法最后一次博客了。还是先介绍几个在C++11之前就存在的,但是与本博客息息相关的算法。首先是: min和max 由于很简单,所以直接上代原创 2016-01-24 19:58:35 · 2818 阅读 · 0 评论 -
C++11新特性应用--介绍几个新增的便利算法(stl中的heap使用,最大堆)
有的时候为了维护数据,我们使用stl的堆去维护一序列。首先您要弄清楚堆和栈的区别,即heap和stackstl中的堆默认是最大堆。先介绍 push_heap,pop_heap,make_heap,sort_heap这四个算法,这四个不是C++11新增加的内容。首先是如何产生一个最大推: make_heap 原型:template <class RandomAccessIterator> vo原创 2016-01-21 22:31:48 · 4121 阅读 · 1 评论 -
C++11新特性应用--介绍几个新增的便利算法(用于排序的几个算法)
继续C++11在头文件algorithm中增加的算法。至少我觉得,在stl的算法中,用到最多的就是sort了,我们不去探索sort的源码,就是介绍C++11新增的几个关于排序的函数。对于一个序列,我们怎么知道他是不是有序的呢?这就用到了:is_sorted 原型:template <class ForwardIterator> ForwardIterator is_sorted_until (原创 2016-01-20 22:11:21 · 2145 阅读 · 0 评论 -
C++11新特性应用--介绍几个新增的便利算法(用于分区的几个算法)
今天继续。C++11新增的关于Non-modifying sequence operations和Modifying sequence operations的算法已经写了,详细信息见之前的博客。下面开始C++11新增的关于Partitions的算法: Partitions:即分区的意思。很多人可能还不熟悉partition,所以先说一说partition算法,需要说明的是这不是C++11新增的内容原创 2016-01-19 20:52:24 · 2028 阅读 · 0 评论 -
C++11新特性应用--介绍几个新增的便利算法(更改容器中元素顺序的算法)
昨天罗列了C++11中新增的几个算法,包括 find_if_not、all_of、any_of、none_of四个算法,这四个算法的共同点就是Non-modifying sequence operations。所以,今天就来八一八C++11中新增的算法,而这些算法的特点是:Modifying sequence operations。copy算法我们很熟悉,这里介绍一下C++11新增的copy_n。c原创 2016-01-18 21:24:16 · 2214 阅读 · 0 评论 -
C++11新特性应用--介绍几个新增的便利算法(不更改容器中元素顺序的算法)
总所周知,C++ STL中有个头文件,名为algorithm,即算法的意思。 The header<algorithm>defines a collection of functions especially designed to be used on ranges of elements.所以,要八一八这个头文件中C++11新增的几个算法,今天主要描述的几个算法不改变容器中元素的顺序。这里还要原创 2016-01-17 20:11:52 · 2118 阅读 · 0 评论 -
C++11中的小细节--字符串的原始字面量
原始字面量很容易理解,即不进行转义的完整字符串。最近看了看Python,其中讲到了原始字符串。Both string and bytes literals may optionally be prefixed with a letter ‘r’ or ‘R’; such strings are called raw strings and treat backslashes as literal c原创 2016-01-13 00:22:08 · 14026 阅读 · 6 评论 -
C++11中的便利工具--chrono库(处理日期和时间)
chrono is the name of a header, but also of a sub-namespace: All the elements in this header (except for the common_type specializations) are not defined directly under the std namespace (like most of原创 2016-01-12 22:05:21 · 8350 阅读 · 2 评论 -
C++11新特性之 std::forward(完美转发)
上篇博客对右值、右值引用都做了简要介绍。我们也要时刻清醒,有时候右值会转为左值,左值会转为右值。 (也许“转换”二字用的不是很准确)如果我们要避免这种转换呢? 我们需要一种方法能按照参数原来的类型转发到另一个函数中,这才完美,我们称之为完美转发。std::forward就可以保存参数的左值或右值特性。因为是这样描述的: When used according to the following原创 2016-01-08 23:59:52 · 35089 阅读 · 3 评论 -
C++11新特性应用--让你的程序更高效(右值引用避免深拷贝)
这里的内容注意参考书籍《深入应用C++11代码优化与工程级应用》今天,重温一下右值。使用右值,使得我们的C++程序更加高效。我们可以简单把右值理解为一个临时变量。之前,我们谁也不会在意这个临时变量,但要付出了效率的代价。而右值引用就是对右值进行的引用类型,与我们通常所说的引用一样,一定要记得初始化。左右值区分:void func(X& x); // 左值引用 重载void func(X&& x);原创 2016-01-07 21:38:51 · 3861 阅读 · 3 评论 -
C++11新特性应用--占位符(std::placeholders std::is_placeholder std::is_bind_expression)
上一篇博客讲了std::function和std::bind的使用,其中提到了占位符,std::placeholders定义如下:namespace placeholders { extern /* unspecified */ _1; extern /* unspecified */ _2; extern /* unspecified */ _3; // ...}This nam原创 2016-01-06 21:05:49 · 32696 阅读 · 0 评论 -
C++11新特性应用--实现延时求值(std::function和std::bind)
说是延时求值,注意还是想搞一搞std::function和std::bind。之前博客《C++11新特性之std::function》注意是std::function如何实现回调函数。现在就算是补充吧,再把std::bind进行讨论讨论。何为Callable Objects? 即可调用对象,比如函数指针、仿函数、类成员函数指针等都可称为可调用对象。对象包装器 Function wrapper原创 2016-01-05 22:28:06 · 5514 阅读 · 0 评论 -
C++11新特性应用--让你的程序更简洁、更漂亮
今天旧事重提,再写一点关于c++11的事儿,注意是说明一下使用C++11使你的程序更加的简洁,更加漂亮。说道简洁,我想最多想到的就是auto关键字的使用了。比如之前你这样定义一个迭代器:std::vector<std::stirng>::iterator iter = vec.begin();但是有了auto关键字,你就可以少些很多代码:auto iter = vec.begin();好吧,你可能早原创 2015-12-30 21:30:24 · 3037 阅读 · 0 评论 -
C++11新特性之 std::future and std::async
先来个小插曲,百度翻译,你够了: std::future 设想这样的情况,你希望一个线程做一些事情,然后返回你一个结果。同时,你在做一些其他的工作,该工作也许会也许不会花费你一点时间。你希望在某个特定的时间获取那个线程的结果。 在win32中,你可以这样 用CreateThread启动线程 在线程里,启动任务,当准备完毕后发送一个事件(event),并把结果放在全局变量里。 在主函数里原创 2015-11-16 21:37:35 · 21518 阅读 · 5 评论 -
开始使用C++11的几个理由
C++11新特性介绍了一段时间,至今为止也差不多了。是要总结的时候了: 你可能会问我,为什么需要C++11呢,我这就给出理由:理由1:《C++11新特性之 Move semantics(移动语义)》 move语义(move semantics)。简单的说,它是优化复制的一种方式。有时候复制很显然是浪费的。如果你从一个临时的string对象复制内容,简单的复制指针到字符缓冲区将比创建一个新的缓冲区原创 2015-11-13 20:55:57 · 3144 阅读 · 4 评论 -
C++11新特性之 Static assertions 和constructor delegation
C++11新特性继续。 Static assertion static_assert 是在编译时期的断言,作用不言而喻的。 语法是这样:static_assert ( bool_constexpr , string ) 其中: bool_constexpr: 常量表达式 string: 如果bool_constexpr表达式为false, 这个string就是编译时候报的错误。看原创 2015-11-11 21:35:37 · 3206 阅读 · 2 评论 -
C++11新特性之 default and delete specifiers
C++11的东西介绍的差不多了,今天介绍两个关键字default和delete!default 首先我们清楚,如果自己提供了任何形式的构造函数,那么编译器将不会产生一个默认构造函数,这是一个放之四海而皆准的原则。但凡是都是双面性,看看一下的代码:class A{public: A(int a){};};然后我们这样使用:A a;悲剧发生了,编译器不会为我们提供默认的构造函数!所以呢,原创 2015-11-10 23:42:45 · 3918 阅读 · 4 评论 -
C++11新特性之 Move semantics(移动语义)
按值传递的意义是什么? 当一个函数的参数按值传递时,这就会进行拷贝。当然,编译器懂得如何去拷贝。 而对于我们自定义的类型,我们也许需要提供拷贝构造函数。但是不得不说,拷贝的代价是昂贵的。所以我们需要寻找一个避免不必要拷贝的方法,即C++11提供的移动语义。 上一篇博客中有一个句话用到了:#include <iostream>void f(int& i) { std::cout << "lval原创 2015-11-09 23:57:33 · 11392 阅读 · 5 评论 -
C++11新特性之 rvalue Reference(右值引用)
右值引用可以使我们区分表达式的左值和右值。C++11引入了右值引用的概念,使得我们把引用与右值进行绑定。使用两个“取地址符号”:int&& rvalue_ref = 99;需要注意的是,只有左值可以付给引用,如:int& ref = 9; 我们会得到这样的错误: “invalid initialization of non-const reference of type int& from an原创 2015-11-09 22:14:06 · 8206 阅读 · 6 评论 -
C++11新特性之 nullptr
我们知道在编程的世界里,0有双重的角色,可以表示整数零,也可以表示一个空指针。在C语言中,通过预编译宏NULL,可以区分0表示的是零还是(void*)0.但是,在C++的世界中,这样是不可以的。C++中允许函数重载。例如:void foo(char *);void foo(int);如果把NULL定义为0,那么foo(NULL)将调用哪个函数呢?这样的话,编译器不会知道调用哪个函数。所以C++11原创 2015-11-08 23:57:27 · 3932 阅读 · 1 评论 -
C++11新特性之 std::array container
数组每个人都很熟悉,vector更是我们常常用到的。但是某些场合,使用vector是多余的,尤其能明确元素个数的情况下,这样我们就付出了效率稍低的代价!但是你使用数组的代价是那么的不安全,那么的不方便。于是,C++11推出了模板类array,位于std名称控件中。 与vector不同的是,array对象的长度是固定的,使用了静态存储区,即存储在栈上,效率跟数组相同,但是更加的安全。首先需要包含头文原创 2015-11-08 21:37:15 · 8365 阅读 · 3 评论 -
C++11新特性之 CALLBACKS
《C++11新特性之std::function》提到了std::function作为回调函数。今天主要讨论不同情况下std::function作为回调使用。使用回调#include <functional>#include <iostream>namespace {using cb1_t = std::function<void()>;using cb2_t = std::function<原创 2015-11-04 21:58:44 · 8886 阅读 · 6 评论 -
c++11特性之std::thread--进阶二
继续C++11的std::thread之旅!下面讨论如何给线程传递参数 这个例子是传递一个string#include <iostream>#include <thread>#include <string>void thread_function(std::string s){ std::cout << "thread function "; std::cout << "m原创 2015-11-04 00:00:12 · 9791 阅读 · 4 评论 -
c++11特性之std::thread--进阶
博客 [c++11特性之std::thread--初识](http://blog.csdn.net/wangshubo1989/article/details/49592517 "std::thread") 讲了std::thread::join和std::thread::detach的用法。今天就再来点深入的。先看看这个:int main(){ std::thread t(&threa原创 2015-11-03 23:49:13 · 6241 阅读 · 2 评论 -
c++11特性之initializer_list
之前写了一个博客《 浅析C++中的初始化列表(区别赋值和初始化)》,讲述了类的构造函数使用初始化列表来初始化成员变量。现在,撇开过往不谈,就谈一谈普通的变量赋值。即是我们要提到的initializer_list。这同样是一个C++11的特性。过往,我们这样给vector赋值:std::vector v;v.push_back(1);v.push_back(2);v.push_back(3);原创 2015-11-03 21:55:04 · 14654 阅读 · 5 评论 -
c++11特性之std::thread--初识二
上篇博客《c++11特性之std::thread–初识》初步介绍了std::thread,并且介绍了几个成员函数。最后的一段代码留了点悬念,就是vs2015会报错,错误如下: error C2893: 未能使函数模板“unknown-type std::invoke(_Callable &&,_Types &&...)”专用化1> d:\program files (x86)\microsoft原创 2015-11-02 22:45:26 · 10382 阅读 · 1 评论 -
c++11特性之std::thread--初识
C++11中已经拥有了一个更好用的用于线程操作的类std::thread。默认构造函数: thread() noexcept; 构造一个任何线程不执行的线程对象。初始化函数: template #include <iostream> // std::cout#include <thread> // std::thread, std::this_thread::sl原创 2015-11-02 21:51:53 · 16540 阅读 · 3 评论 -
c++11特性之Lambda表达式
“Lambda 表达式”(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。我第一次接触Lambda表达式是在C#中,后来才知道C++11引入了Lambada表达式。SO C++ 11 标准的一大亮点是引入Lambda表达式。基本语法如下: [c原创 2015-10-19 23:18:42 · 7916 阅读 · 0 评论 -
c++11特性之正则表达式
C++11中也将正则表达式纳入了新标准的一部分,不仅如此,它还支持了6种不同的正则表达式的语法,分别是:ECMASCRIPT、basic、extended、awk、grep和egrep。其中ECMASCRIPT是默认的语法,具体使用哪种语法我们可以在构造正则表达式的时候指定。正则表达式库提供表示正则表达式,这是一种用于字符串内执行模式匹配小型的语言的类。主要的类: basic_regex reg原创 2015-10-17 12:36:05 · 4892 阅读 · 0 评论 -
C++11新特性之std::function
博客《吐血整理C++11新特性》描述了一些C++11带来的新的特性,但是不够全面。在实际工作中,用到了std::function来实现回调函数。所以写该博客做一个简要补充。类模版std::function是一种通用、多态的函数封装。std::function的实例可以对任何可以调用的目标实体进行存储、复制、和调用操作,这些目标实体包括普通函数、Lambda表达式、函数指针、以及其它函数对象等。std原创 2015-10-14 23:53:47 · 70360 阅读 · 6 评论