![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 67
_好好学习
这个作者很懒,什么都没留下…
展开
-
C++实现优先级队列模板类
1. 优先级队列1.1 基本原理仿照C++ STL 中的优先级队列priority_queue,主要实现以下功能:向队列中添加元素后,队列自动调整,保证队列中优先级最高的元素在队列头部(优先级可以定义比较函数,按照大小或者其他条件决定); 每次出队元素是队列中优先级最高的,因此优先级队列不满足先进先出的原则,而是根据每次都是优先级最高的先出。优先级队列ADT的API如下: 方法名 功能 push() 添加一个元素原创 2021-03-12 15:45:46 · 719 阅读 · 0 评论 -
C++——多线程
目录1. 线程创建1.1 创建函数作为线程工作函数1.2 创建匿名函数作为线程工作函数1.3 类成员函数作为线程工作函数2. 线程互斥2.1 使用mutex进行线程互斥2.2 使用lock_guard和mutex实现线程互斥3. 其他功能函数3.1 join和detach3.2 线程暂停3.3 赋值运算符1. 线程创建1.1 创建函数作为线程工作函数新建一个工作函数作为线程工作函数,然后在后面跟上工作函数的传入参数,如下:#include .原创 2020-09-04 10:56:56 · 407 阅读 · 0 评论 -
数据结构与算法——常见排序算法写成模板,新建命名空间打包带走
1. 前文汇总前面陆陆续续总结过常用排序算法,如下:数据结构与算法——快排序数据结构与算法——插入排序C++——归并排序,从固定数据类型到函数模板以及使用函数对象自定义递增/递减数据结构与算法——插入排序——使用C++实现函数模板、数据结构与算法——希尔排序数据结构与算法——选择排序2. 常用排序算法整理将常用的排序算法进行了实现,写成了模板,并放在了一个命名空间下面。包括插入排序,选择排序,希尔排序,快排序,堆排序和归并排序。需要注意的就是模板的特化,不能将模板函数原创 2020-09-03 14:43:28 · 265 阅读 · 0 评论 -
设计模式——单例
1. 懒汉式单例懒汉式单例在第一次被使用的时候才会进行实例化。1.1 单线程的懒汉式单例#include <iostream>using namespace std;class Singleton {private: Singleton() { cout << "Construct called!" << endl; } Singleton(Singleton&) = delete; Singleton& operator=(co原创 2020-09-03 11:46:08 · 100 阅读 · 0 评论 -
数据结构与算法——并查集(Union-Find)
1. 原理/概念并查集(Union-Find)主要用来解决无向图的【动态连通性】问题,对于无向图的连通,一般具有如下几个性质:自反性:节点p和 p 是连通的; 对称性:如果节点 p 和节点 q 连通,那么节点 q 和 p 也是连通的; 传递性:如果节点 p 和 q 连通, q 和 r 连通,那么 p 和 r 连通。本文参考一个大神labuladong的算法小抄:Union-Find算法详解,主页在这。注意,并查集只能用来解决无向图的连通性的问题,如果是有向图,要找其强连通分量,需要用t..原创 2020-09-03 10:44:37 · 491 阅读 · 0 评论 -
数据结构与算法——选择排序
1. 选择排序的基本原理原理详解可以参考浙大的数据结构与算法。简单说选择排序的思想就是:选择排序每趟遍历未排序的序列,从其中选出一个元素(升序就选最小的,降序就选最大的),将其与无序区最前面的元素交换,使得有序区元素个数+1,无序区元素个数-1。这样每趟遍历可以从无序区中挑一个元素放到有序区中,直到最后无序区中元素个数为0.2. C++实现选择排序原理比较简单,这里就直接贴代码:选择排序功能函数:/** * @brief 选择排序主函数,提供通用的外部接口 * @param[i原创 2020-08-04 14:37:02 · 201 阅读 · 0 评论 -
数据结构与算法——希尔排序
1. 希尔排序基本原理原理详解可以参考浙大的原创 2020-08-01 13:31:22 · 302 阅读 · 0 评论 -
数据结构与算法——插入排序——使用C++实现函数模板
1. 插入排序原理插入排序是最基本的排序算法,之前写过一篇文章实现插入排序,不过是用的C语言+函数指针,使得用户可以自定义升序排序还是降序排序。现在考虑使用C++,将该算法做成一个函数模板。2. 将排序算法做成函数模板几个关键字:【函数模板】,【函数对象】,【匿名函数】,【友元函数】。对于基本数据类型,构建函数模板比较简单,排序的比较也可以直接用STL里面的less和great函数对象。对于自定义类型的数据,需要实现自定义类型对象的比较,可以1)重载比较运算符,less重载"<"运原创 2020-07-31 21:25:55 · 982 阅读 · 0 评论 -
C++——归并排序,从固定数据类型到函数模板以及使用函数对象自定义递增/递减
1. 归并排序几个高级排序算法之一,具体原理可以参考这个视频:归并排序算法讲解。基本原理就是使用分治的思想,将数组不断二分,分割成单个元素,然后从单个元素开始两两合并,将两个有序的数组片段合并为一个新的有序片段。最后将整个数组归为有序。基本步骤:将数组不断二分,分割成只包含单个元素的片段; 对分割之后的片段进行两两合并,将两个片段合并为一个有序的大片段,最底层是对于单个元素的片段进行合并,单个元素肯定有序,合并只需要根据两个元素的大小进行片段的重排。需要使用额外的内存空间保存两个子片段,然后在原创 2020-07-26 16:51:47 · 361 阅读 · 0 评论 -
C/C++——字符串分割(strtok, strtok_s)
1. 使用strtok分割字符串strtok()函数的原型如下:char *__cdecl strtok(char *_String, const char *_Delimiter)strtok()函数接收两个传入参数,将_String中保存的字符串(待处理字符串),按照_Delimiter中的字符作为分隔符进行分割。如果_String为空,则函数内部保存的SAVE_PTR指针在下一次调用中将作为起始位置。其实这就说明在函数strtok()内部使用了一个静态变量SAVE_PTR指针,用以记原创 2020-06-21 15:07:02 · 28840 阅读 · 5 评论 -
C++——list(线性双向链表)
1. 基本概念list也是C++ STL中提供的一种容器,是线性的双向链表的数据结构。拥有链式结构的特征:支持元素的快速插入和删除,但是元素随机访问较慢(相较于vector容器),不提供[]运算符的重载。C++中使用list容器需要包含头文件<list>,把list当做双向链表来看,可以记住list的常用操作,如下:push_back():添加元素到list尾部。 push_back():添加元素到list头部。 pop_back():从list尾部删除元素。 pop_front(原创 2020-06-09 18:32:10 · 1422 阅读 · 0 评论 -
C++——string类
1. string类1.1 基本概念string是C++ STL 中定义的标准类,与C语言中的字符数组(char[])类似,但是有更完善的API,使用更加便捷。C++中使用string类,要引用头文件<string>。1.2 string的构造string有好几个构造函数,使用方式如下: string str1; //不初始化,默认为空 string str2("Hello"); //使用字符串"Hello"初始化,str2中内容为"Hello" s原创 2020-06-05 19:04:11 · 289 阅读 · 0 评论 -
C++——优先级队列(priority_queue)
1.优先级队列(priority_queue)1.1 基本概念之前已经提到了队列(queue),队列是一种先进先出(First in First out,FIFO)的数据类型。每次元素的入队都只能添加到队列尾部,出队时从队列头部开始出。优先级队列(priority_queue)其实,不满足先进先出的条件,更像是数据类型中的“堆”。优先级队列每次出队的元素是队列中优先级最高的那个元素,而不是队首的元素。这个优先级可以通过元素的大小等进行定义。比如定义元素越大优先级越高,那么每次出队,都是将当前队.原创 2020-06-04 17:26:39 · 28557 阅读 · 4 评论 -
C++——双端队列(deque)
1. 双端队列(deque)双端队列(deque)是队列的一种变形,一般队列只能在队尾添加元素(push),在队首删除元素(pop),双端队列则同时在队首或者队尾执行添加和删除工作。C++中,使用双端队列需要包含头文件<deque>。C++中队列的基本操作如下:push_back():在队列尾部添加元素,无返回值。这个操作跟普通队列(queue)的push()方法类似,在队列的尾部添加一个元素; push_front():在队列头部添加元素,无返回值; pop_back():删除队列原创 2020-06-03 22:31:44 · 16273 阅读 · 1 评论 -
C++——队列(queue)和栈(stack)
1. 队列(queue)队列是一种先进先出(First in First out,FIFO)的数据类型。每次元素的入队都只能添加到队列尾部,出队时从队列头部开始出。C++中,使用队列需要包含头文件<queue>。C++中队列的基本操作如下:push() :入队。在队列尾端添加一个元素,无返回值; pop() :出队。将队列头部元素删除(出队),无返回值; front() :获得队列头部元素。此函数返回值为队列的头部元素,常与pop()函数一起,先通过front()获得队列头部元素,然原创 2020-06-01 18:44:01 · 4695 阅读 · 2 评论 -
LeetCode(46):全排列
1. 题目描述2. 题目理解看到这道题,就是典型的“回溯”问题,可以使用回溯算法来解决。回溯也是递归的过程,这里写了一下回溯算法的简单框架://回溯算法的框架void backTrack(最终结果(res),子结果(subRes),选择列表){ if(满足结束条件)结果中新增该项; for(遍历选择列表){ if(该项选择已经被包含在subRes中)continue; 将该选择项包含在子结果中; backTrac原创 2020-05-29 12:22:26 · 231 阅读 · 0 评论 -
LeetCode(105):从前序与中序遍历序列构造二叉树
1. 题目描述2. 题目理解前序遍历数组的首元素一定是当前子树的根节点。根据这一性质,找到当前子树的根节点,然后查找该节点在中序遍历数组中的位置,可以得到当前根节点左子树中元素的个数。将中序遍历按照根节点分为左右两部分,对应左右子树的中序遍历;同时将前序遍历按照根节点以及根节点左子树中元素的个数,也分成左右两部分,对应左右子树的前序遍历。按照以上思路,用递归的方式可以构造出整个树。3. 代码3.1 C语言代码/** * Definition for a binary tree原创 2020-05-25 11:16:05 · 131 阅读 · 0 评论