C++98、11、14、17
C++各标准全面认识
昔拉天使
I wanna the world know my existence.
展开
-
9-11 萃取(traits)技术概念、范例等(未归类知识点)
040类型萃取_迭代器萃取#include<iostream>#include<iostream>#include<cstdlib>#include<functional>#include <vector>#include <algorithm>#include <list>using namespace std;template <typename T>void printTraitsI原创 2020-07-25 16:32:46 · 221 阅读 · 0 评论 -
9-10 可变参数函数、initializer_list、省略号形参(未归类知识点)
039可变参数列表initializer_list和可变参点点点类型#include<iostream>#include<iostream>#include<cstdlib>#include<functional>#include <vector>#include <algorithm>#include<initializer_list>#include<stdarg.h>//...的头文件us原创 2020-07-25 16:32:09 · 263 阅读 · 0 评论 -
9-9 lambda表达式捕获模式的陷阱分析和展示(未归类知识点)
035lambda常见陷阱_捕获列表中的引用_局部变量超出作用域#include<iostream>#include<iostream>#include<cstdlib>#include<functional>#include <vector>#include <algorithm>#include <ctime>using namespace std;//全局变量,每个元素都是function,每个元素原创 2020-07-25 16:31:24 · 554 阅读 · 0 评论 -
9-8 lambda表达式,for_each、find_if简介(未归类知识点)
028lambda表达式和捕获列表#include<iostream>#include<cstdlib>using namespace std;class CT{public: int m_i; void myFunction(int x,int y) { auto mylambda01 = [this]()//=或者&默认就有this访问 { return m_i;//因为前面已经有this,访问合法 }; }};int ma原创 2020-07-25 16:11:21 · 435 阅读 · 0 评论 -
9-7 可调用对象、std function、std bind(未归类知识点)
021可调用对象#include<iostream>#include<cstdlib>using namespace std;void myFunciton(int value){ cout << "myFunciton函数执行了" << endl;}class TESTCLASS{public: void operator()(int value) { cout << "这是类中重载了()运算符的函数执行了" &原创 2020-07-25 16:09:17 · 520 阅读 · 2 评论 -
9-6 详解decltype含义,decltype主要用途(未归类知识点)
014decltype含义和举例_用于推导类型#include<iostream>#include<cstdlib>#include <functional>using namespace std;class CT{public: int i; int j;};int testFunction(){ return 10;}const int&&myfunctionTest(void){ return 0;}i原创 2020-07-25 16:07:10 · 2360 阅读 · 0 评论 -
9-5 理解auto类型推断,auto应用场合(未归纳知识点)
009auto类型常规推断#include<iostream>#include<cstdlib>#include <boost/type_index.hpp>using namespace std;//显示参数类型,这里不研究boost库template<typename T>void myFunction01(T&tem)//T是类型模板参数,T是有类型的,tem是形参,tem也是有类型的{ using boost::type原创 2020-07-25 09:23:13 · 461 阅读 · 0 评论 -
9-4 引用折叠,转发、完美转发,forward(未归类知识点)
005引用折叠规则与引用的引用#include<iostream>#include<cstdlib>#include <boost/type_index.hpp>using namespace std;template<typename T>void myFunction01(T &&tem)//T是类型模板参数,T是有类型的,tem是形参,tem也是有类型的{ using boost::typeindex::type_id_原创 2020-07-25 09:21:40 · 277 阅读 · 0 评论 -
9-3 理解模板类型推断、查看类型推断结果(未归类知识点)
004理解模板类型参数_查看类型推断结果#include<iostream>#include<cstdlib>#include <boost/type_index.hpp>using namespace std;//显示参数类型,这里不研究boost库template<typename T>//void myFunction01(T&tem)//T是类型模板参数,T是有类型的,tem是形参,tem也是有类型的void myFunct原创 2020-07-25 09:19:54 · 289 阅读 · 0 评论 -
9-2 万能引用universal reference(未归类知识点)
003万能引用#include<iostream>#include<cstdlib>using namespace std;template <typename T>void myFunction(const T&value)//value的类型是const T&{ return;}void myFunction02(int&& tem)//参数是右值引用类型{ cout << "右值引用函数" &l原创 2020-07-25 09:19:04 · 230 阅读 · 0 评论 -
9-1 函数调用运算符、function类模板(未归类知识点)
001重载()函数对象#include<iostream>#include<cstdlib>using namespace std;void myFunction(int a_i){ cout << "这是我自定义的函数myFunction" << endl; return;}//类实现的功能:返回一个大于等于0的数字,如果小于0,返回0class BiggerThanZero{public: //带一个参数的构造函数 Big原创 2020-07-12 23:38:16 · 190 阅读 · 0 评论 -
8-8 适配器概念、分类、范例及总结
008适配器#include<iostream>#include<cstdlib>#include<string>#include<vector>#include <memory>#include <set>#include <map>#include <list>#include <array>#include <functional>using namespac原创 2020-07-12 21:50:18 · 214 阅读 · 0 评论 -
8-7 函数对象回顾、系统函数对象及范例
007可调用队形与标准库中定义的可调用对象#include<iostream>#include<cstdlib>#include<string>#include<vector>#include <memory>#include <set>#include <map>#include <list>#include <array>#include<functional>u原创 2020-07-12 20:41:36 · 176 阅读 · 0 评论 -
8-6 算法概述、内部处理、使用范例
006算法概述与一些典型的算法应用举例#include<iostream>#include<cstdlib>#include<string>#include<vector>#include <memory>#include <set>#include <map>#include <list>#include <array>#include<algorithm>usi原创 2020-07-12 20:40:29 · 415 阅读 · 0 评论 -
8-5 迭代器的概念和分类
005迭代器概述与迭代器分类#include<iostream>#include<cstdlib>#include<string>#include<vector>#include <memory>#include <set>#include <map>#include <list>#include <array>using namespace std;//(3)验证迭代器所属种原创 2020-07-12 20:39:32 · 258 阅读 · 0 评论 -
8-4 分配器概述、使用,工作原理说
004分配器的概念和一个简单分配器原理核心代码#include<iostream>#include<cstdlib>#include<string>#include<vector>#include <memory>#include <list>using namespace std;int main(void){ //list<int, std::allocator<int>>myLis原创 2020-07-12 20:38:04 · 1008 阅读 · 0 评论 -
8-3 容器的说明和简单应用例续
003deque和stack一些常见的容器#include<iostream>#include<cstdlib>#include<string>#include<vector>#include <memory>#include<queue>#include<map>#include <set>#include <unordered_set>using namespace std;原创 2020-07-12 20:37:21 · 139 阅读 · 0 评论 -
8-2 容器分类,array、vector容器精解
001容器分类和array容器的使用#include<iostream>#include<cstdlib>#include<string>#include<vector>#include <memory>#include <array>using namespace std;int main(void){ //包含5个元素的数组 array<string, 5>mystring = { "fsdfd原创 2020-07-11 00:46:31 · 184 阅读 · 0 评论 -
8-1 STL总述、发展史、组成,数据结构谈
000STL概述/* * (1)一些概念 * 1.c++标准库 standard library c++编译器自带,可以在代码中包含头文件直接使用。 * 引入的目的就是解决一些反复使用的功能,我们直接使用即可。 * 2.c++标准模板库,STL=standard template library。包含在c++标准库中,是c++标准库的核心。 * STL深刻影响着c++标准库 * 3.泛型编程 generic programming 使用模板template为主要的编程手段来编写代码。 *原创 2020-07-11 00:44:53 · 237 阅读 · 0 评论 -
6-13 补充知识、线程池浅谈、数量谈、总结
一:补充知识1.1、虚假唤醒: wait中要有第二个参数(lambda)并且这个lambda中要正确判断要处理的公共数据是否存在;wait(),notify_one(),notify_all()1.2、atomic+=是原子操作,a=a + 1不是cout<<atm<<endl; //读atm是个原子操作,但是整个这一行代码并不是个原子操作;atomic atm;atm = 0;auto atm2 = atm; //这种定义时初始化操作不允许,显示”尝试引用已删除的函原创 2020-07-09 15:13:48 · 168 阅读 · 0 评论 -
6-12 windows临界区、其他各种mutex互斥量
一:windows临界区二:多次进入临界区试验在“同一个线程”(不同线程就会卡住等待)中,windows中的"相同临界区变量“代表的临界区的进入(EnterCriticalSection)可以被调用多次但是你调用了几次EnterCriticalSection,你就得调用几次LeaveCriticalSection(&my_winsec);class A{public: //把收到的消息(玩家命令)入到一个队列的线程 void inMsgRecvQueue() { for(int原创 2020-07-05 11:43:42 · 297 阅读 · 0 评论 -
6-11 std atomic续谈、std async深入谈
一:原子操作std::atomic续谈一般atomic原子操作,针对++,–,+=,&=,|=,^=是支持的。std::atomic<int> g_mycout = 0;//这是个原子整型类型变量;可以向使用整型变量一样使用void mythread(){ for(int i = 0;i<1000000;i++) { g_mycout++; //对应的操作就是原子操作,不会被打断; g_mycout +=1; g_mycout = g_mycout + 1;原创 2020-07-04 21:26:41 · 195 阅读 · 0 评论 -
6-10 future其他成员函数、shared_future、ato
一:std::future的其他成员函数int mythread(){ cout<<"mythread() start"<<"threadid="<<std::this_thread::get_id()<<endl;//新的线程id std::chrono::milliseconds dura(5000);//1秒=1000毫秒,所以5000毫秒=5秒 std::this_thread::sleep_for(dura); //休息一定的时长 cou原创 2020-07-03 23:44:25 · 223 阅读 · 0 评论 -
6-9 async、future、packaged_task、pro
一:std::async、std::future创建后台任务并返回值希望线程返回一个结果;std::async是个函数模板,用来启动一个异步任务,启动起来一个异步任务之后,他返回一个std::future对象,std::future是个类模板。什么叫”启动一个异步任务“,就是自动创建一个线程并开始执行对应的线程入口函数,它返回一个std::future对象,这个std::future对象里边就含有线程入口函数所返回的结果(线程返回的结果);我们可以通过调用future对象的成员函数get()来获取。原创 2020-07-03 17:34:27 · 253 阅读 · 0 评论 -
6-8 condition_variable、wait
一:条件变量std::condition_variable、wait()、notify_one()线程A:等待一个条件满足线程B:专门往消息队列中扔消息(数据)std::condition_variable实际上是一个类,是一个和条件相关的一个类,说白了就是等待一个条件达成。这个类是需要和互斥量来配合工作,用的时候我们要生成这个类的对象;class A{public: std::unique_lock<std::mutex> rtn_unique_lock() { std:原创 2020-07-03 11:20:02 · 631 阅读 · 0 评论 -
6-7 单例设计模式共享数据分析、解决,call_once
一:设计模式大概谈“设计模式”:代码的一些写法(这些写法跟常规写法不怎么一样);程序灵活,维护起来可能方便,但是别人接管、阅读代码都会很痛苦;用“设计模式”理念写出来的代码很晦涩;《head first》老外应付特别大的项目的时候,把项目的开发经验、模块划分经验,总结整理成设计模式(现有开发需求,后有理论总结和整理);设计模式拿到中国来,不太一样,拿着一个程序(项目)往设计模式上套;一个小小的项目,它非要弄几个设计模式进去,本末倒置设计模式肯定有它独特的优点,要活学活用,不要深陷堪中,生搬硬套;原创 2020-07-03 00:54:28 · 202 阅读 · 0 评论 -
6-6 unique_lock详解
class A{public: std::unique_lock<std::mutex> rtn_unique_lock() { std::unique_lock<std::mutex> tmpguard(my_mutex1); return tmpguard;//从函数返回一个局部的unique_lock对象是可以的。 //返回这种局部对象tmpguard会导致系统生成临时unique_lock对象,并调用unique_lock的移动构造函数 } //把收到原创 2020-07-02 21:53:31 · 290 阅读 · 2 评论 -
6-5 互斥量概念、用法、死锁演示及解决详解
一:互斥量(mutex)的基本概念保护共享数据,操作时,某个线程用代码把共享数据锁住、操作数据、解锁,其他想操作共享数据的线程必须等待解锁,锁定住,操作,解锁。互斥量是个类对象。理解成一把锁,多个线程尝试用lock()成员函数来加锁这把锁头,只有一个线程能锁定成功(成功的标志是lock()函数返回),如果没锁成功,那么流程卡在lock()这里不断的尝试去锁这把锁头;class A{public: //把收到的消息(玩家命令)入到一个队列的线程 void inMsgRecvQueue() {原创 2020-06-27 15:59:43 · 322 阅读 · 0 评论 -
6-4 创建多个线程、数据共享问题分析、案例代码
一:创建和等待多个线程a、多个线程执行顺序是乱的,跟操作系统内部对线程的运行调度机制有关;b、主线程等待所有子线程运行结束,最后主线程结束,推荐这种join的写法,更容易写出稳定的程序;c、把thread对象放入到容器里管理,看起来像个thread对象数组,这对我们一次创建大量的线程并对大量线程进行管理很方便。//线程入口函数void myprint(int inum){ cout<<"myprint线程开始执行了,线程编号="<<inum<<endl;原创 2020-06-26 23:21:35 · 244 阅读 · 2 评论 -
6-3 线程传参详解,detach()大坑,成员函数做线程函数
一:传递临时对象作为线程参数1.1、要避免的陷阱1(解释1)1.2、要避免的陷阱2(解释2)class A{ public: mutable int m_i; //const下也能修改 //类型转换构造函数 A(int a):m_i(a){cout<<"构造函数执行"<<this<<"threadid="<<std::this_thread::get_id()<<endl;} A(const A &a):m_i(a.m_i原创 2020-06-26 16:34:21 · 300 阅读 · 0 评论 -
6-2 线程启动、结束,创建线程多法、join,detach
一、范例演示线程运行的开始和结束程序运行起来,生成一个进程,该进程所属的主线程开始自动运行;cout<<“I Love China!” << endl; //实际上这个是主线程在执行,主线程从main()函数返回,则整个进程执行完毕。主线程从main()开始执行,那么我们自己创建的线程,也需要从一个函数开始运行(初始函数),一旦这个函数运行完毕,就代表着我们这个线程运行结束。整个进程是否执行完毕的标志是主线程是否执行完,如果主线程执行完毕了,就代表整个进程执行完毕了;此时,原创 2020-06-26 02:30:24 · 236 阅读 · 1 评论 -
6-1 并发基本概念及实现,进程、线程基本概念
一、并发、进程、线程的基本概念和综述并发,线程,进程的要求必须掌握;1.1、并发两个或更多的任务(独立的活动)同时发生(进行):一个程序同时执行多个独立任务;以往计算机,单核cpu(中英处理器):某一个时刻只能执行一个任务:由操作系统调度,每秒钟进行多次所谓的“任务切换”。造成并发的假象(不是真正的并发);这种切换(上下文切换)是要有时间开销的,比如操作系统要保存你切换时的各种状态,执行进度等信息,都需要时间,一会切换回来的时候要复原这些信息。硬件发展,出现了多处理器计算机:用于服务器和高性能计算原创 2020-06-25 22:06:44 · 223 阅读 · 0 评论 -
5-7 返回unique_ptr、删除器、尺寸、智能指针
007unique_ptr使用方法总结和智能指针概述#include<iostream>#include<cstdlib>#include<string>#include<vector>#include <memory>using namespace std;unique_ptr<string>myFunction(){ unique_ptr<string>pr(new string("dsfsdf"原创 2020-06-25 21:08:33 · 249 阅读 · 1 评论 -
5-6 unique_ptr概述、常用操作
006unique_ptr概述和常见操作#include<iostream>#include<cstdlib>#include<string>#include<vector>#include <memory>using namespace std;class A{public: A(){} ~A() { ; }};auto myFunction(){ return unique_ptr<string原创 2020-06-25 21:07:49 · 253 阅读 · 0 评论 -
5-5 shared_ptr使用场景、陷阱、性能分析、使用建议
005shared_ptr常用操作与使用陷阱#include<iostream>#include<cstdlib>#include<string>#include<vector>#include <memory>using namespace std;//测试类class CT:public enable_shared_from_this<CT>{public: shared_ptr<CT>gets原创 2020-06-25 21:07:05 · 386 阅读 · 0 评论 -
5-4 weak_ptr概述、weak_ptr常用操作、尺寸
004weak_ptr概述与常见操作#include<iostream>#include<cstdlib>#include<string>#include<vector>#include <memory>using namespace std;int main(void){ //weak_ptr一般是使用shared_ptr来创建爱女 auto p1 = make_shared < int>(100); we原创 2020-06-25 21:06:34 · 218 阅读 · 0 评论 -
5-3 shared_ptr常用操作、计数、自定义删除器等等
003share_ptr的引用和减少与常见操作#include<iostream>#include<cstdlib>#include<string>#include<vector>#include <memory>using namespace std;class A{public: A() {} ~A() { }};//void myfunction(shared_ptr<int>&原创 2020-06-25 21:05:58 · 238 阅读 · 0 评论 -
5-2 new、delete探秘,智能指针概述、shared_ptr
001newdelete探秘#include<iostream>#include<cstdlib>#include<string>#include<vector>using namespace std;class A{public: A() { cout << "构造函数被执行" << endl; } ~A(); };A::~A(){ cout << "析构函数被执行" <原创 2020-06-25 21:05:25 · 303 阅读 · 0 评论 -
5-1 直接内存管理(new-delete)、创建新工程观察内存泄漏
000new和delete常见用法#include<iostream>#include<cstdlib>#include<string>#include<vector>using namespace std;int main(void){ static int j = 23;//局部静态对象,在静态区分配内存 int i = 10;//由系统进行分配和释放 int *p1 = new int;//动态内存分配,初值未定义 st原创 2020-06-25 21:04:10 · 151 阅读 · 0 评论 -
可变参模板续、模板模板参数
022模板模板参数写法#include<iostream>#include<cstdlib>#include<string>#include<vector>#include <list>using namespace std;//从类模板引入//template<typename T,typename U>//t u叫模板参数,更具体叫类型模板参数(前面有typename)template< typename原创 2020-06-13 14:25:27 · 171 阅读 · 0 评论