C++11
文章平均质量分 81
一只牛_007
这个作者很懒,什么都没留下…
展开
-
C++11 简化 “策略模式” 的一种思路
使用函数对象取代虚函数的一个理由是它去除了继承的限制,实现了松耦合,方法实现更加灵活,然而这个优点也可能成了它的缺点,当需要替代的虚函数增多时,组装function 的复杂度也在增加,太松散了导致代码不够直观,代码的内聚性也变低了原创 2023-01-10 10:52:17 · 298 阅读 · 0 评论 -
C++ std::condition_variable wait() wait_for() 区别
一、std::condition_variable 是条件变量。wait()当 std::condition_variable 对象的某个 wait 函数被调用的时候,它使用 std::unique_lock(通过 std::mutex) 来锁住当前线程。当前线程会一直被阻塞,直到另外一个线程在相同的 std::condition_variable 对象上调用了 notification 函数来唤醒当前线程。首先我们来看一个简单的例子#include <iostream>原创 2022-01-27 15:02:19 · 2481 阅读 · 0 评论 -
C++17特性一览
引言再说回C++17,这次的更新比C++14要大不少,其中很多东西都可以为我们的C++代码在优化代码可读性的同时提高效率,我们一起来看看吧构造函数模板推导其实我更愿意叫它模板类型自动推导,代码展示大概就是这样: vector items = {1,2,3}; // pair pa(4, "string"); 不直接匹配字符串 pair pa(4, string("hihi")); cout << pa.second << " " << items[原创 2021-07-02 14:53:34 · 657 阅读 · 0 评论 -
C++14 新特性
一、新的语言特性1 、泛型的 Lambda 函数在 C++11 中,lambda 函数的形式参数需要被声明为具体的类型。C++14 放宽了这一要求,允许 lambda 函数的形式参数声明中使用类型说明符 auto。auto lambda = [](auto x, auto y) {return x + y;}泛型 lambda 函数遵循模板参数推导的规则。以上代码的作用与下面的代码相同:struct unnamed_lambda{template<typename T,原创 2021-07-02 13:21:09 · 6819 阅读 · 1 评论 -
智能指针简单实现unique_ptr和shared_ptr
1 序1.1 智能指针为了避免手动在堆中分配出的内存没有释放造成内存泄露的问题,C++11提供了智能指针。智能指针将指针封装成一个栈对象。栈对象在生命周期结束自动销毁时会调用析构函数。智能指针基本上也是在析构函数中做文章,实现的堆上内存管理。C++11推荐使用的智能指针有unique_ptr、shared_ptr和weak_ptr三种。1.2 内容简介本文为std::unique_ptr的实现篇,介绍实现一个UniquePtr类,实现与std::unique_ptr类似的功能。代码实原创 2021-06-23 13:50:21 · 1600 阅读 · 1 评论 -
C++知识 interview
https://zhuanlan.zhihu.com/p/54078587转载 2021-05-21 15:01:31 · 167 阅读 · 0 评论 -
push_back和emplace_back的区别
在引入右值引用,转移构造函数,转移复制运算符之前,通常使用push_back()向容器中加入一个右值元素(临时对象)的时候,首先会调用构造函数构造这个临时对象,然后需要调用拷贝构造函数将这个临时对象放入容器中。原来的临时变量释放。这样造成的问题是临时变量申请的资源就浪费。引入了右值引用,转移构造函数后,push_back()右值时就会调用构造函数和转移构造函数。在这上面有进一步优化的空间就是使用emplace_backemplace_back函数原型:template <class...原创 2021-03-25 19:59:37 · 204 阅读 · 0 评论 -
C++11库中 steady_clock , system_clock和high_resolution_clock的区别
C++11 中提供了一个计时的标准库<chrono>;里面有三种时钟 clock: steady_clock, system_clock 和 high_resolution_clock;区别steady_clock 是单调的时钟,相当于教练手中的秒表;只会增长,适合用于记录程序耗时; system_clock 是系统的时钟;因为系统的时钟可以修改;甚至可以网络对时; 所以用系统时间计算时间差可能不准。 high_resolution_clock 是当前系统能够提供的最高精度的时钟.原创 2021-03-25 15:11:04 · 8857 阅读 · 1 评论 -
C++11 新的计时方法——std::chrono 大法好
计时有很多用途,比如:测试某一段代码的运行时间,时间越短,则性能相对越高。计时有很多方法,我将首先给出我以前常用的一种计时方法,然后给出我认为的最佳方法(采用了C++11的标准技术)。首先给出我以前常用的一种“传统”的计时方法:#include <ctime>int main(){ clock_t start = clock(); // for (auto i = 0; i < 1000000; i++); clock_t end = clock(); cout原创 2021-03-25 14:45:47 · 1041 阅读 · 0 评论 -
智能指针weak_ptr
开始之前先看一段代码,struct A { std::shared_ptr<B>pointer; ~A() { std::cout<< "A被销毁"<<std::end; }};struct B { std::shared_ptr<A>pointer; ~B() { std::cout<< "B被销毁"<<std::end; }};int ma原创 2021-03-25 14:16:46 · 1004 阅读 · 0 评论 -
智能指针shared_ptr
std::unique_ptr是C++11标准中用来取代std::auto_ptr的指针容器(在C++11中,auto_ptr被废弃)。它不能与其它unique_ptr类型的指针对象共享所指对象的内存。这种”所有权”仅能够通过标准库的move函数来转移。unique_ptr是一个删除了拷贝构造函数、保留了移动构造函数的指针封装类型。下面的脑图总结了unique_ptr的特性:1. 一个unique_ptr"拥有"它所指向的对象。与shared_ptr不同,某个时刻只能有一个unique_ptr指向.原创 2021-03-25 14:11:14 · 486 阅读 · 0 评论 -
智能指针unique_ptr
shared_ptrshared_ptr实现共享式拥有概念。多个智能指针可以指向相同对象,该对象和其相关资源会在“最后一个引用被销毁”时候释放。从名字share就可以看出了资源可以被多个指针共享,它使用计数机制来表明资源被几个指针共享。可以通过成员函数use_count()来查看资源的所有者个数。除了可以通过new来构造,还可以通过传入auto_ptr, unique_ptr,weak_ptr来构造。当我们调用release()时,当前指针会释放资源所有权,计数减一。当计数等于0时,资源会被释放。1原创 2021-03-25 13:57:03 · 258 阅读 · 0 评论 -
用C++11 实现 thread pool
最近看了看我的计划,写道这里也算是到了一半,大部分都是讲的单一的C++11的用法,基本都是理论知识,就像我上大学的时候,老师一直讲理论知识,结局就是能去能不去的时候,我选择了后者。所以在这里穿插一下小的综合运用文章,让大家知道为什么要用C++11,C++11好在哪里,项目中如何运用C++11.首先介绍一下背景。在我们的工作中,避免不了多线程之间的配合。在现在处理器动辄8核16核的背景下,如果我们的程序还停留在单线程的模型,那么我们就没法享受多处理器带来的性能提成。之前看过我司代码中的threadpool原创 2021-03-25 10:04:25 · 1478 阅读 · 2 评论 -
标准化条件变量 -- condition_variable
std::condition_variable是条件变。Linux下使用 Pthread库中的 pthread_cond_*()函数提供了与条件变量相关的功能。和pthread_cond_*()一样,我们可以使用条件变量(condition_variable)实现多个线程间的同步操作;当条件不满足时,相关线程被一直阻塞,直到某种条件出现,这些线程才会被唤醒。C++11通过std::condition_variable,对于条件变量进行了统一化,标准化。condition_variable 的用法很简单.原创 2021-03-25 09:45:18 · 449 阅读 · 2 评论 -
std::future和std::promise和std::packaged_task
std::future其实future有两个兄弟,一个是std::future, 一个是它大哥std::shared_future。他们的区别就是std::future只支持移动语义,它所引用的共享状态不与另一异步返回对象共享。换成人话就是如果你想在多个线程共享一个future,那么你应该用std::shared_future,换成大白话就是你要是想多个线程等待一个future,那么你应该用std::shared_future。如果还是不明白,文章最后会给一个小例子说明。这篇文章主要讲的是std::fu原创 2021-03-25 09:42:54 · 809 阅读 · 0 评论 -
std::mutex
C++11中新增了<mutex>,它是C++标准程序库中的一个头文件,定义了C++11标准中的一些互斥访问的类与方法等。C++11标准库定义了4个互斥类:std::mutexstd::mutex 是C++11 中最基本的互斥量,std::mutex 对象提供了独占所有权的特性——即不支持递归地对 std::mutex 对象上锁,而 std::recursive_lock 则可以递归地对互斥量对象上锁。 下面给出一个与 std::mutex 的小例子(http://www.c原创 2021-03-24 21:00:45 · 229 阅读 · 0 评论 -
lambda 和 std::function
1. Lambda函数的用处lambda 表达式可以方便地构造匿名函数,如果你的代码里面存在大量的小函数,而这些函数一般只被调用一次,那么不妨将他们重构成 lambda 表达式。C++11 的 lambda 表达式规范如下:[ capture ] ( params ) mutable exception attribute -> ret { body } (1) [ capture ] ( params ) -> ret { body } (2) [ captur原创 2021-03-24 20:50:01 · 1864 阅读 · 0 评论 -
移动语义、完美转发
右值引用(rvalue reference)是 C++11 为了实现移动语意(move semantic)和完美转发(perfect forwarding)而提出来的。右值引用,简单说就是绑定在右值上的引用。右值的内容可以直接移动(move)给左值对象,而不需要进行开销较大的深拷贝(deep copy)。在面向对象中,有的类是可以拷贝的,例如车、房等他们的属性是可以复制的,可以调用拷贝构造函数,有点类的对象则是独一无二的,或者类的资源是独一无二的,比如 IO 、 std::unique_ptr等,他原创 2021-03-24 17:32:36 · 303 阅读 · 0 评论 -
左值、右值、左值引用、右值引用
1. 左值左值(lvalue,left value),顾名思义就是赋值符号左边的值,可以取地址。准确来说,左值是表达式(不一定是赋值表达式)后依然存在的持久对象。可以将左值看作是一个关联了名称的内存位置,允许程序的其他部分来访问它。在这里,我们将 "名称" 解释为任何可用于访问内存位置的表达式。所以,如果 arr 是一个数组,那么 arr[1] 和 *(arr+1) 都将被视为相同内存位置的“名称”。2. 右值右值(rvalue,right value),右边的值,是指表达式结束后就不再存在原创 2021-03-24 17:26:26 · 1978 阅读 · 1 评论 -
using(别名)和range based for
using(别名)替代typedef关键字using语法别名声明是具有下列语法的声明:using标识符attr(可选)=类型标识;(1)template<模板形参列表>using标识符attr(可选)=类型标识;(2)attr(C++11)-可选的任意数量属性的序列标识符-此声明引入的名字,它成为一个类型名(1)或一个模板名(2)模板形参列表-模板形参列表,同模板声明类型标识-抽象...原创 2021-03-24 17:06:06 · 277 阅读 · 0 评论 -
变长参数模板 和 外部模板
变长参数模板解释C++03只有固定模板参数。C++11 加入新的表示法,允许任意个数、任意类别的模板参数,不必在定义时将参数的个数固定。变长模板、变长参数是依靠C++11新引入的参数包的机制实现的。参数包 一个模板形参包(template parameter pack)是一个接受零个或多个模板实参的模板形参。 template<class...Types>structTuple{};Tuple<> t0; // Types不含任何实...原创 2021-03-24 16:59:00 · 242 阅读 · 0 评论 -
变量之--列表初始化和结构化绑定
变量之(变长)列表初始化关键词std::initializer_list解释在 C++98/03 中的对象初始化方法有很多种,这无疑增大了学习难度。这中情况在C++11中终于得到解决。先看看没有C++11的时候 //初始化列表 int i_arr[3] = { 1, 2, 3 }; //普通数组 struct A { int x; struct B { int i; in原创 2021-03-24 16:03:12 · 226 阅读 · 0 评论 -
nullptr/nullptr_t
解释关键词 nullptr 代表指针字面量。它是 std::nullptr_t 类型的纯右值。存在从 nullptr 到任何指针类型及任何成员指针类型的隐式转换。同样的转换对于任何空指针常量也存在,空指针常量包括 std::nullptr_t 的值,以及宏 NULL。引入原因为什么引入nullptr呢, 不是有NULL这个关键字么?的确,但是我想问你NULL是什么类型的?C++98中NULL是个宏定义,明确规定NULL是个整型0值:/* Define NULL pointer va原创 2021-03-24 15:51:16 · 1068 阅读 · 0 评论 -
decltype 和 auto
返回类型推导 decltypedecltype 推导规则编译器将根据以下三条规则得出结果:如果 exp 是一个不被括号( )包围的表达式,或者是一个类成员访问表达式,或者是一个单独的变量,那么 decltype(exp) 的类型就和 exp 一致,这是最普遍最常见的情况。 如果 exp 是函数调用,那么 decltype(exp) 的类型就和函数返回值的类型一致。 如果 exp 是一个左值,或者被括号( )包围,那么 decltype(exp) 的类型就是 exp 的引用;假设 exp.原创 2021-03-24 15:46:37 · 222 阅读 · 0 评论 -
C++11构造与禁用默认函数
C++11(五)继承构造在继承体系中,假设派生类想要使用基类的构造函数,必须要在构造函数中显式声明。举个小例子:class Base {public: int value1; int value2; Base() { value1 = 1; } Base(int value) : Base() { // 委托 Base() 构造函数 value2 = value; }};class Subclass原创 2021-03-13 20:51:21 · 3717 阅读 · 0 评论 -
C++11强类型枚举,override/final
C++11(一)开篇这个系列主要介绍C++11的一些新的特性,C++11问世至今已经有将近十年了。但是许多公司仍然停留在C++98上。之前在部门分享过C++11的知识,在这里分享给有需要的人。C++是一门伟大的语言,永远给程序员最大的设计自由, 未使用的特性从不产生副作用,新版本永远完全兼容旧版本。C++11先前被称作C++0x,即ISO/IEC 14882:2011,是C++编程语言的一个标准。之前的C++标准包括C++98、C++03。虽然此后的[C++14]才是C++的现行标准,但C++1原创 2021-03-13 20:03:00 · 530 阅读 · 0 评论