
C++
Mr.禾
这个作者很懒,什么都没留下…
展开
-
C++11 线程池实现
概述1、一个线程 pool,所有线程阻塞等待唤醒(有任务时唤醒)2、任务队列 queue,队列中添加任务后就唤醒线程,线程从队头取走任务执行。典型的生产者-消费者模型。3、mutex对队列上锁, 保证队列任务添加和取走的同步性4、当线程数不足时可以动态增加线程数量。代码threadpool.hpp头文件#pragma once#include <iostream>#include<stdlib.h>#include<thread>#include&原创 2021-07-27 21:20:54 · 1249 阅读 · 8 评论 -
C++ 快速排序实现
#include <iostream>#include <string>#include<vector>#include<algorithm>#include <functional>using namespace std;class Less{public: template<typename T1, typename T2> bool operator()(const T1& a, const T2.原创 2021-07-12 16:09:58 · 288 阅读 · 0 评论 -
C++ push_back() 和emplace_back() 用法区别
push_bach():首先调用构造函数构造一个临时对象,然后在容器尾部区域利用这个临时对象进行拷贝构造,最后释放临时变量。emplace_back():这个元素原地构造,不需要触发拷贝构造和转移构造。详细测试见代码:#include<iostream>#include <vector>using namespace std;class test{public: int id; test() :id(0) { cout << "默认构造" &原创 2021-06-29 16:56:25 · 531 阅读 · 0 评论 -
C++ async用法
async概述std::async() 是一个接受回调(函数或函数对象)作为参数的函数模板,并有可能异步执行它们.std::async返回一个 std::future < T >,它存储由 std::async()执行的函数对象返回的值。std::launch 中两个标志位会影响async实现方式1、launch::async异步任务:#include <thread>#include <iostream>#include <future>原创 2021-06-24 19:41:13 · 6806 阅读 · 5 评论 -
C++ 原子操作(atomic)
1、atomic概述所谓原子操作,就是多线程程序中“最小的且不可并行化的”操作。对于在多个线程间共享的一个资源而言,这意味着同一时刻,多个线程中有且仅有一个线程在对这个资源进行操作,即互斥访问。C++ 11 新增atomic可以实现原子操作2、非原子操作#include <thread>#include <atomic>#include <iostream>using namespace std;int i = 0;const int maxCnt =原创 2021-06-24 14:23:04 · 8826 阅读 · 2 评论 -
C++多线程 async,future, packaged_task , promise用法
1、asyncasync: 启动一个异步线程,可以配合future类来获得返回值#include<iostream>#include<thread>#include<future>using namespace std;int mythread(){ cout << "mythread start,id= " << this_thread::get_id() << endl; this_thread::sleep_原创 2021-06-23 16:55:47 · 326 阅读 · 1 评论 -
C++ 单例模式 代码详解
单例模式单例模式(Singleton Pattern)是 最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。有以下注意的点:1、单例类只能有一个实例。2、单例类必须自己创建自己的唯一实例。3、单例类必须给所有其他对象提供这一实例。比如我们在写服务器程序时,日志对象实例就应该是单例模式,下面介绍两原创 2021-06-22 19:47:12 · 714 阅读 · 1 评论 -
C++ 生产者消费者简单模型(C++11 thread)
#include <iostream>#include<thread>#include<vector>#include<list>#include<mutex>using namespace std;class test{private: mutex mut; list<int> li;public: test() {}; ~test() { cout << "~test" <&l原创 2021-06-22 10:39:35 · 213 阅读 · 0 评论 -
C++ 最小堆代码实现 详细注释
文章目录概述代码图形化输出堆概述二叉树相关1、完全二叉树:若二叉树的深度为h,则除第h层外,其他层的结点全部达到最大值,且第h层的所有结点都集中在左子树。2、满二叉树:满二叉树是一种特殊的的完全二叉树,所有层的结点都是最大值,即每层都是满节点状态。堆1、堆是一颗完全二叉树;2、堆中的某个结点的值总是大于等于(最大堆)或小于等于(最小堆)其孩子结点的值。3、堆中每个结点的子树都是堆树。4、每个堆的堆顶元素必然是堆中所有元素中最大值(最大堆)或最小值(最小堆)下图所示为最小堆:因为是完全二原创 2021-05-30 20:00:29 · 1035 阅读 · 6 评论 -
C++ 自定义智能指针shared_ptr
概述(1)理解share的意义,多个智能指针可以共享一份内存空间(通常是new出来的类实例)。(2)体现在shared_ptr的use_count()计数上,每多一个智能指针指向该内存资源,计数就加1,每结束一个智能指针则计数减1。(3)当use_count()为0时,意味着没有任何智能指针指向申请的内存空间,那么就回收此内存资源。详细解释见代码注释代码#include"iostream"#include<mutex>using namespace std;//辅助类tem原创 2021-05-21 22:04:56 · 415 阅读 · 0 评论 -
C++ 完美转发forward理解
概述完美转发std::forward 实现完美转发,作用就是保持传参参数属性不变,如果原来的值是左值,经std::forward处理后该值还是左值;如果原来的值是右值,经std::forward处理后它还是右值。详细说明见代码注释代码#include <iostream>#include <string>#include<algorithm>using namespace std;//左值引用void process(int& x){ co原创 2021-05-20 21:32:13 · 2805 阅读 · 2 评论 -
C++ condition_variable用法
概述condition_variable类似于信号量机制,实现了线程的等待和唤醒。函数接口:wait() :阻塞等待的同时释放锁(原子操作),还可以添加阻塞判断函数,详见代码notify_all() : 唤醒所有阻塞等待的线程notify_one(): 唤醒某一个等待的线程代码#include<iostream> #include<thread> #include<mutex> #include<condition_variable>原创 2021-04-20 14:48:57 · 5276 阅读 · 0 评论 -
C++ 实现 linkhashmap数据结构
需求分析1.保存插入的先后顺序2.快速查找指定数据解决方案:双向链表 + hash表1.链表采用头插法,那么尾部数据自然就是最早插入的数据2.为了方便删除,采用双向链表3.每插入一个数据,就在hash表中记录位置,方便查找代码实现#include <iostream>#include<unordered_map>#include<set>#include<unordered_set>using namespace std;clas原创 2021-04-10 17:10:45 · 416 阅读 · 0 评论 -
C++ 函数传递多参数处理 可变参数模板
1、initializer_list形参如果函数的实参数量未知但是全部实参的类型都相同,我们可以使用initializer_list类型的形参(C++11新标准)initializer_list提供的一些操作:#include<initializer_list> // 头文件initializer_list lst; // 默认初始化,T类型元素的空列表initializer_list lst{a,b,c…}; // 初始化为初始值列表的副本lst2(lst) // 拷贝或赋原创 2021-03-14 17:47:02 · 6889 阅读 · 0 评论 -
C++ 智能指针 shared_ptr用法
shared_ptr主要如下:(1)创建出来后,在生命周期结束后自动释放并调用对象的析构函数。(2)理解shared的意义,多个智能指针可以共享一个对象,其体现在shared_ptr的use_count()计数上,每多一个智能指针,计数就加1,每结束一个智能指针则减1,只有当use_count()为1时#include<iostream>using namespace std;class aa {public: aa() { printf("创建aa对象\n"); } ~a原创 2021-01-24 20:22:14 · 284 阅读 · 0 评论 -
string数组的字典序排列 C++
#include <iostream>#include <string>#include<vector>#include<algorithm>using namespace std;template<typename T >void fun(T val){ cout << val << endl;}bool cmp(string s1, string s2){ if (s1.size() != s.原创 2021-01-23 20:39:09 · 3844 阅读 · 2 评论 -
C++ 图形化 打印二叉树
代码如下#include<iostream>#include<queue>using namespace std;class node {public: node(int n, bool color_type=true) :val(n), color(color_type),left(nullptr),right(nullptr),parent(nullptr) {}; int val; node* left; node* right; node* parent原创 2020-12-23 14:43:34 · 2422 阅读 · 1 评论 -
C++ tuple用法
可以说是pair的升级版#include<iostream>#include<vector>#include <algorithm>#include<map>#include <iterator>using namespace std;int main(){ tuple<int, string, float, double> t(66,"hello world",3.33,9.9999); auto t2 =原创 2020-12-20 20:31:09 · 386 阅读 · 0 评论 -
自定义pair模板类 带三个参数
mypair#include<iostream>#include<vector>#include <algorithm>#include<map>using namespace std;template<typename T1, typename T2, typename T3>class mypair {public: T1 first; T2 second; T3 third; mypair() :first(T1()原创 2020-12-19 19:46:10 · 1455 阅读 · 1 评论 -
operator++(int) 与 operator ++ 两者区别详解
测试程序详细分析见代码注释#include<iostream>#include <bitset>using namespace std;class Point{private: int x;public: Point(int x1) :x(x1) {}; int getx() { return this->x; }; Point& operator++();//成员函数定义自增 const Point operator++(int n); /原创 2020-12-14 20:05:54 · 3632 阅读 · 2 评论 -
函数指针 代码测试
#include<iostream>#include <bitset>using namespace std;typedef int(*func)(int, int); //函数指针类型,func代表这样一个函数类型:返回值是int的带有两个int参数的函数int add(int a, int b){ return a + b;}void test(int (*testFunc)(int, int)){ cout<<test原创 2020-12-13 22:29:16 · 176 阅读 · 0 评论 -
C++ 虚函数和虚函数表详解(底层分析、代码测试)
概述C++中虚函数是通过一张虚函数表(Virtual Table)来实现的,在这个表中,主要是一个类的虚函数表的地址表;这张表实现了函数的动态绑定。在有虚函数的类的实例中这个表被分配在了这个实例的内存中,所以当我们用父类的指针来操作一个子类的时候,这张虚函数表就像一张地图一样指明了实际所应该调用的函数。C++编译器是保证虚函数表的指针存在于对象实例中最前面的位置(是为了保证取到虚函数表的最高的性能),这样我们就能通过已经实例化的对象的地址得到这张虚函数表,再遍历其中的函数指针,并调用相应的函数。需要原创 2020-12-08 09:35:32 · 407 阅读 · 0 评论 -
C++ 简单定义一个vector类
myVector#pragma once#include<iostream>#include<cstring>using namespace std;template<typename T>class myVector{public: myVector(); myVector(int len, T element); myVector(const myVector<T>& rhc); ~myVector(); myVect原创 2020-12-03 19:22:51 · 2026 阅读 · 0 评论 -
C++ 时钟的操作 hh:mm:ss格式
#include <iostream>#include<string>using namespace std;int main(){ string ss; int x; int box[3] = {0,0,0}; int index = 0; int h, m, s; cin >> ss; cin >> x; //减去x秒 for (int i = 0,j=0; j < ss.size(); j++) { if (ss原创 2020-11-29 11:10:07 · 2097 阅读 · 0 评论 -
C++ define使用问题
#define使用问题#include <iostream>using namespace std;#define func_max(a,b) f((a)>(b)? (a):(b)) //即使加上所有的小括号,仍有奇怪问题发生 void f(int n){ cout<<"func="<<n<<endl;}int main(){ int a = 5, b = 0; func_max(++a, b); //a实原创 2020-11-26 09:43:42 · 271 阅读 · 0 评论 -
C++ cin.getline和 cin.get用法和区别
cin.getline()#include <iostream>#include<iomanip>#include<string>using namespace std;const int Limit = 255;int main(){ char input[Limit]; cout << "Enter a string for getline() processing:\n"; cin.getline(input,原创 2020-11-25 17:23:53 · 311 阅读 · 0 评论 -
C++ make_pair和map用法
make_pair不需要指定参数类型,如pair<int,int>;见代码:#include<iostream>#include<map>#include<vector>#include<ctime>#include<string>#include<sstream>using namespace std;int main(){ map<pair<int, int>, int&g原创 2020-10-11 17:34:16 · 2232 阅读 · 0 评论 -
C++ stringstream 从字符串中分离单词
#include<iostream>#include<map>#include<vector>#include<ctime>#include<string>#include<sstream>using namespace std;int main(){ int n; string str = {"abc hello world"}; string s; stringstream ss;原创 2020-10-10 16:13:46 · 1198 阅读 · 0 评论