![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++日记
自学C++课程的知识点基类,全程干货,不扯没用的
lucky0han
永远保持低姿态,你才能不断成长。
展开
-
C++——线程池实例分析
class fixed_thread_pool { public: explicit fixed_thread_pool(size_t thread_count) : data_(std::make_shared<data>()) { for (size_t i = 0; i < thread_count; ++i) { std::thread([data = data_] { std::unique_lock<std::mutex&.原创 2020-06-29 23:31:42 · 386 阅读 · 1 评论 -
C++日记——Day61:auto类型推断,auto应用场合
特点:1、auto自动类型推断发生在编译期,所以不会影响程序执行期间的性能;2、auto定义变量必须立即初始化,这样编译器才能推断它的实际类型。那么编译的时候才能确定auto的类型和整个变量的类型,然后在编译期间就可以用真正的类型替换掉auto这个类型占位符。3、auto的使用灵活,和指针 和引用 和const 等限定符结合使用。auto类型推导出来一个具体类型。auto实际上是一个类型,那么这里的auto实际上就相当于模板函数推导里边的类型模板参数T。所以auto这个东西也是类型声明.原创 2020-06-10 23:44:04 · 428 阅读 · 0 评论 -
C++日记——Day60:转发、完美转发
template <typename F, typename T1, typename T2>void myFuncTemp(F f, T1 t1, T2 t2){ f(t1, t2);}void myfunc(int v1, int &v2){ ++v2; cout << v1 + v2 << endl;}int main(){ int j = 10; myFuncTemp(myfunc, 12, j).原创 2020-06-02 23:43:34 · 179 阅读 · 0 评论 -
C++日记——Day59:万能引用
template<typename T>void func(T&& tmpv){ cout << tmpv << endl; return;}万能引用:既能接受右值,又能接受左值满足以下条件,右值引用会变为万能引用:a、必须是函数模板b、必须是发生了模板类型推断并且函数模板形参的样子是:T&&;auto也存在万能引用,以后再说。T&& 就是万能引用, 单独的T不是万能引用万..原创 2020-05-08 23:09:54 · 236 阅读 · 0 评论 -
C++日记——Day58:STL算法概述、内部处理、使用范例
算法概述可以理解为函数模板。比如:查找、排序等,有数十上百个算法,前两个参数一般都是迭代器类型,表示容器中的元素的一个区间调用方式:算法名(iterbg,itered)传递进去的应该是前闭后开的区间 [ begin() , end()] ;好处:a、如果第一个形参等于第二个形参,也就是 iterbg == itered, 那么就表示是个空区间;b、迭代时,算法判断迭...原创 2020-04-23 23:08:47 · 231 阅读 · 0 评论 -
C++日记——Day57:迭代器的概念和分类
迭代器基本概念迭代器是一个“可遍历STL容器全部或者部分元素”的对象(行为类似于指针对象)迭代器是用来表现容器中的某一个位置;迭代器依赖于容器,是由容器来提供的,也就是说,一般来讲,容器里边迭代器。迭代器的分类分类依据:迭代器的移动特性,以及这个迭代器上能够进行的操作;迭代器行为如指针到处跳,表示一个位置,我们一般分类是依据他的跳跃能力,每个分类是一个对应struct...原创 2020-04-19 22:57:45 · 195 阅读 · 0 评论 -
C++日记——Day56:容器的说明和简单应用例续
顺序容器:deque(double end queue):双向开口。相当于动态数组:头部和尾部插入和删除数据头很快;如果像中间插入元素,那么可能涉及到要移动其他元素,效率会比较低;分段连续queue:队列,这是个普通队列,先进先出,后进后出,基本的数据结构stack:栈(堆栈),先进后出,只有一个开口,只要把的却左边开口封死我们就可以认为它变成了一个stack;和v...原创 2020-04-13 23:18:56 · 114 阅读 · 1 评论 -
C++日记——Day55:容器分类,array、vector容器精解
容器分类:(三大类)1、顺序容器:放进去在哪里元素就排在哪里。如:arrary、vector、deque、list、forward_list;2、关联容器:元素是 键/值 对,特别适合做查找。你能控制插入内容,但是一般来讲你不能控制插入位置。如:hash_set、hash_map、hash_multiset、hash_multimap;3、无序容器:元素位置不重要,重要的是这个元素在容...原创 2020-04-10 23:07:44 · 218 阅读 · 0 评论 -
C++日记——Day54:STL综述
概念:C++标准库: C++ standard Library。C++标准模板库:Standard Template Library(STL)泛型编程:使用模板为主要的编程手段来编程编写的代码。我们可以认为标准模板库就是用泛型编程的编码方式所写的一套供我们非常使用的一套库。使用标准库说明:所有内部用到的东西都在这个命名空间内,所以,.cpp源码文件开头一般都会写入如下代码...原创 2020-04-09 14:02:34 · 181 阅读 · 0 评论 -
C++日记——Day52:嵌入式指针概念、内存池改进版
嵌入式指针一般应用在内存池相关的代码中,成功使用嵌入式指针有个前提条件:类A对象的sizeof必须不小于4个字节工作原理:借用A对象所占用的内存空间中的前4个字节,用来链住这些空闲的内存块;但是一旦某一块内存被分配出去,那么这个块的前4个字节就不在需要了,此时这4个字节(这里的4字节指的是当前编译器默认的指针类型所占内存大小)可以被类A对象正常使用;嵌入式指针代码演示...原创 2020-04-08 23:45:53 · 1166 阅读 · 0 评论 -
C++日记——Day48:线程池浅谈、数量谈、总结
虚假唤醒:当 wait() 不带有第二个判断条件参数时会发生虚假唤醒的情况,所以wait()中尽量要带有第二个参数,并且这个lambda表达式要正确判断处理的公共数据是否存在atomic:std::atomic<int> atm = 0; cout << atm << endl;这里只有读取atm是原子操作但是,整个cout <&l...原创 2020-04-03 23:05:32 · 262 阅读 · 0 评论 -
C++日记——Day47:其他各种mutex互斥量
windows临界区Windows临界区,同一个线程是可以重复进入的,但是进入的次数与离开的次数必须相等。C++互斥量则不允许同一个线程重复加锁。RAII类:(Resource Acquisition is initialization)资源获取及初始化递归独占互斥量std::recursive_mutexstd::mutex 独占式互斥量std::recur...原创 2020-04-03 16:15:05 · 165 阅读 · 0 评论 -
C++日记——Day46:std::atomic续谈、std::async深入谈
using namespace std;std::atomic<int> g_count = 0; //封装了一个类型为int的 对象(值)void mythread1() { for (int i = 0; i < 1000000; i++) { g_count = g_count + 1; //虽然g_count使用了原子操作模板,但是这种写法既读又写, ...原创 2020-04-02 23:36:12 · 183 阅读 · 0 评论 -
C++日记——Day45:future其他成员函数、shared_future、atomic
std::future 的成员函数1、wait_for():std::status::timeout \std::status::ready \std::status::deferred#include <thread>#include <iostream>#include <list>#include <map>#includ...原创 2020-04-02 21:26:53 · 176 阅读 · 0 评论 -
C++日记——Day44:async、future、packaged_task、promise
一:std::async、std::future创建后台任务并返回值std::async是一个函数模板,用来启动一个异步任务,启动起来一个异步任务之后,它返回一个std::future对象,这个对象是个类模板。什么叫“启动一个异步任务”?就是自动创建一个线程,并开始 执行对应的线程入口函数,它返回一个std::future对象,这个std::future对象中就含有线程入口函数所返回的结果...原创 2020-03-31 23:02:35 · 180 阅读 · 0 评论 -
C++日记——Day43:condition_variable、wait、notify_one、notify_all
一、条件变量condition_variable、wait、notify_one、notify_allstd::condition_variable实际上是一个类,是一个和条件相关的类,说白了就是等待一个条件达成。std::mutex mymutex1;std::unique_lock<std::mutex> sbguard1(mymutex1);std::conditi...原创 2020-03-30 14:26:39 · 593 阅读 · 0 评论 -
C++日记——Day42:单例设计模式共享数据分析、解决,call_once
设计模式:代码的一些写法:程序灵活,维护起来可能方便,但是别人接管比较麻烦用“设计模式”理念写出来的代码很晦涩老外应付特别大项目的时候,把项目经验、模块划分经验,总结成设计模式(先有开发需求,后又理论总结和整理)设计模式肯定有它独特的有点,要活学活用,不要深陷其中单例设计模式使用的频率比较高定义:整个项目中,由某个或者某些特殊的类,属于该类的对象只能创建一个,多了创建...原创 2020-03-27 11:40:33 · 164 阅读 · 0 评论 -
C++日记——Day41:unique_lock详解
unique_lock取代lock_guardunique是个类模板,工作中,一般lock_guard(推荐使用);lock_guard取代了mutex的 lock() 和 unlock();unique_lock比lock_guard灵活很多,效率上差一些,内存占用多一些#include <thread>#include <iostream>#inc...原创 2020-03-26 11:34:42 · 242 阅读 · 0 评论 -
C++日记——Day40:互斥量概念、用法、死锁演示及解决详解、std::lock()模板、std::lock_guard的std::adopt_lock参数
互斥量基本概念保护共享数据,某个线程 用代码把共享数据锁住,其它想操作共享数据线程必须等待解锁基本过程:锁定,操作,解锁互斥量:是个类对象。理解成一把锁,多个线程尝试用lock()函数来加锁这把锁头时,只有一个线程能锁定成功。(成功的标志是lock()函数返回),如果没锁成功,那么流程卡在lock()这里不断尝试去锁这把锁头。慎用lock()保护共享数据不多也不少,少了达不到效果,...原创 2020-03-25 23:55:39 · 489 阅读 · 0 评论 -
C++日记——Day39:探讨类对象是否执行初始化问题
class B {public: B() { cout << "构造函数执行" << endl; }};int main(){ B b; }发现此时执行了构造函数。之后我们将b后面加上()class B {public: B() { cout << "构造函数执行" << endl; }};...原创 2020-03-25 11:50:18 · 250 阅读 · 0 评论 -
C++日记——Day38:创建多个线程、数据共享问题分析、案例代码
创建和等待多个线程void myprint2(const int &mybuf) { cout << "子线程开始,threadid=" << mybuf << endl; cout << "子线程结束,threadid=" << mybuf << endl;}int main() { vector&...原创 2020-03-25 11:20:23 · 190 阅读 · 0 评论 -
C++日记——Day37:线程传参详解,detach()大坑,成员函数做线程函数
传递临时对象作为线程参数void myprint(const int &i, char *pmybuf) //分析发现,i并不是myvar的引用,实际是值传 //递,那么我们认为,即便主线程detach了子线 //程,...原创 2020-03-24 21:23:48 · 245 阅读 · 0 评论 -
C++日记——Day36:线程启动、结束,创建线程多法、join,detach
线程运行的开始和结束整个进程是否执行完毕的标志是 主线程是否执行完,如果主线程执行完毕了,就代表整个进程执行完毕了;此时,一般情况,如果其他子线程还没有执行完毕,那么这些子线程也会被操作系统强行终止。所以,一般情况下,如果大家想保持子线程(自己用代码创建的线程)的运行状态,大家就要让主线程一直保持运行,不要让主线程运行完毕。(这条规律有例外)#include <thread...原创 2020-03-23 22:01:03 · 229 阅读 · 0 评论 -
C++日记——Day35:并发基本概念及实现,进程、线程基本概念
并发、进程、线程的基本概念并发两个或者更多的任务(独立的事情)同时进行;一个程序同时执行多个独立的任务;以往计算机只有单核cpu,某一时刻只能执行一个任务:有操作系统调度,每秒钟进行多次所谓的“任务切换”。不是真正的并发,属于并发的假象;这种切换(上下文切换)是要有时间开销的,比如操作系统要保存你切换时的各种状态,执行进度等信息,都需要时间一会儿切换回来时需要复原这些信息。...原创 2020-03-23 11:39:03 · 127 阅读 · 0 评论 -
C++日记——Day34:返回unique_ptr、删除器、尺寸、智能指针
返回unique_ptrunique_ptr<string> tuniqp(){ unique_ptr<string> pr(new string("good luck")); return pr; //从函数返回一个局部的unique_ptr对象,这种局部对象,导致系统给我们生 //成一个临时的unique_pt...原创 2020-03-23 00:20:48 · 377 阅读 · 0 评论 -
C++日记——Day33:unique_ptr概述、常用操作
unique_ptr概述独占式的概念(专属所有权);同一时刻只能有一个unique_ptr指向这个对象(这块内存);当这个unique_ptr被销毁时,它所指向的对象也被销毁;格式:unique_ptr<对象类型> 智能指针变量名常规初始化unique_ptr<int> pi;if(pi == nullptr){ cout <<...原创 2020-03-20 23:16:43 · 184 阅读 · 0 评论 -
C++日记——Day32:shared_ptr使用场景、陷阱、性能分析、使用建议
shared_ptr使用场景shared_ptr<int> create0(int value){ return make_shared<int>(value);}shared_ptr<int> myfunc(int value){ shared_ptr<int> tmp = create0(value); r...原创 2020-03-20 13:28:08 · 555 阅读 · 1 评论 -
C++日记——Day31:weak_ptr概述、weak_ptr常用操作、尺寸
weak_ptr概述:weak_ptr用来辅助shared_ptr进行工作;强指针指的是shared_ptr,弱指针值得是weak_ptr;weak_ptr:也是个类模板,智能指针。这个智能指针指向一个由shared_ptr管理的对象。但是weak_ptr这种指针不控制指针的生命周期,换句话来说,将weak_ptr绑定到shared_ptr上并不会改变shared_ptr的引用计数(更...原创 2020-03-19 11:25:28 · 220 阅读 · 0 评论 -
C++日记——Day30:shared_ptr常用操作、计数、自定义删除器等等
shared_ptr引用计数的增加和减少共享式:引用计数,每个shared_ptr的拷贝都指向相同的内存(对象),只有最后一个指向该对象的shared_ptr指针在不需要在指向该对象时,shared_ptr才会去析构所指向的对象。引用计数的增加每个shared_ptr都会记录有多少个其他的shared_ptr指向相同的对象;auto p6 = make_shared<...原创 2020-03-18 13:11:13 · 541 阅读 · 0 评论 -
C++日记——Day29:new、delete探秘,智能指针概述、shared_ptr基础
一、new / delete探秘1、new,delete是什么sizeof关键字,不是一个函数。new,delete关键字,不是函数。malloc,free主要用于C语言,而new,delete用于C++编程,这两对都用于动态的在堆中分配和释放内存。new,delete会调用类的构造与析构函数,malloc与free比new和delete更底层。new / delete具备对 ...原创 2020-03-17 16:57:52 · 298 阅读 · 0 评论 -
C++日记——Day28:直接内存管理(new/delete)
直接内存管理局部静态对象:局部静态对象所在函数被执行时初始化局部静态对象,当函数执行完成时不会释放对象,程序终止时释放对象,分配在静态存储区。临时对象:随函数的执行,与结束,初始化与回收,分配在栈区。new分配方式我们称为动态分配(分配在堆上):直接内存管理(new / delete);如何初始化:int pointi = new int; //初值未定义strin...原创 2020-03-17 10:34:32 · 120 阅读 · 0 评论 -
C++日记——Day27:可变参模板、模板模板参数
可变参模板1、通过递归组合方式展开参数包class B {public: //....};class A{public: B b; //A中包含B对象};class myclasst<First, Others...>{public: myclasst(): m_i(0) { printf("myc...原创 2020-03-15 00:20:02 · 162 阅读 · 0 评论 -
C++日记——Day26:可变参模板
可变参函数模板允许模板中含有0个,到 任意个 模板参数,在语法上也和传统模板不太一样。多了一个 ...template<typename ... T>void myfunc1(T... args){}func(){ myfunc1();}值得注意的:1、我们一般把args成为一包,或者一堆参数,而且这些参数类型可以各不相同;我们理解T这种类...原创 2020-03-12 20:11:18 · 156 阅读 · 0 评论 -
C++日记——Day26:模板全特化、偏特化(局部特化)
类模板特化 相反 泛化:模板,可以随便指定类型。对特殊的类型进行特殊的对待,给他开小灶,给他写适合它的专用代码。类模板全特化:1、常规全特化:只要特化,一定先存在泛华template <typename T, typename U>struct TC{ void functest(){ cout &l...原创 2020-03-12 11:41:27 · 173 阅读 · 0 评论 -
C++日记——Day25:using定义模板别名,显式指定模板参数
using定义模板别名typedef:一般用来定义类型别名typedef unsigned int uint_t;uint_t abc;typedef std::map<std::string, int> map_s_i;map_s_i mymap;mymap.insert({"first", 1});//希望定义一个类型,前边这部分固定不变,是 std:...原创 2020-03-10 23:22:01 · 210 阅读 · 0 评论 -
C++日记——Day24:成员函数模板,显式实例化、声明
普通类的成员函数模板不管是普通类还是类模板,它的成员函数可以是一个函数模板,称为“成员函数模板”,不可以是虚函数,否则编译器会报错。class A{public: template<typename T> void myfunc(T tmpt){ cout << tmpt << endl; }};in...原创 2020-03-09 23:55:26 · 200 阅读 · 0 评论 -
C++日记——Day23:typename的使用场合、函数指针做其他函数的参数、可调用对象、默认模板参数
typename使用场合1、在模板定义里表明气候的参数是类型参数//函数模板template<typename T, int a, int b>int funcadd(T c) { };//类模板template<typename T, int b>class myvector { };注意这里的typename可以写成class2、使...原创 2020-03-05 13:45:42 · 566 阅读 · 0 评论 -
C++日记——Day22:类模板概念与类模板定义
概述用类模板实例化一个特定的类。编译器不能为类模板推断模板参数类型,所以为了使用类模板,我么必须在模板后边用<>来提供额外的信息,这些信息其实就是对应着模板参数列表中的参数。例如:vector<int>目的:同一套代码可以应付不同的 数据类型,这样就精简多了。类模板定义template<typename 形参名1, typename 形参...原创 2020-03-04 22:32:49 · 207 阅读 · 0 评论 -
C++日记——Day22:函数模板定义、使用、非类型模板参数
概述:1、所谓泛型编程,是以独立于任何特定类型的方式编写代码。使用泛型编程时,我们需要提供具体程序实例所操作的类习惯或者值。2、模板是泛型编程的基础。模板是创建类型或者函数的蓝图或者公式。我们给这些蓝图或者公式提供足够的信息,让这些蓝图或者公式真正变成具体的类或者函数,这种转变发生在编译时。3、模板支持将类型作为参数程序设计方式,从而实现了对泛型程序设计的直接支持。也就是说C++模板机...原创 2020-03-03 22:43:59 · 432 阅读 · 0 评论 -
C++日记——Day21:转换构造函数、运算符、类型指针
类型转换构造函数:我们通过 类型转换构造函数 和 类型转换运算符 来做到 类型转换。构造函数:移动构造函数,拷贝构造函数,默认构造函数、普通构造函数特点:1、以类名作为函数名2、没有返回值;类型转换构造函数特点:有一种构造函数叫“类型转换构造函数”,主要能力是:它可以将某个其他的数据转换成该类类型的对象。特点:1、只有一个参数,该参数又不是本类的const引用...原创 2020-03-03 15:13:36 · 256 阅读 · 0 评论