C++
Charlesix59
我不造啊!
展开
-
C语言等于运算符返回什么?
于是我便敲了一个程序来验证,运行结果果然和C reference中的描述的一样。,因为我的记忆中没有关于赋值表达式的返回值是什么的答案,于是我根据我的经验,给出了这个我觉得最有可能的答案。但是我本人也对这个答案持怀疑态度。于是我便查阅了C reference。赋值表达式a=5的值是____思考一小下,你觉得答案是什么?这才发现,原来是有返回值的,原创 2023-02-28 15:24:27 · 546 阅读 · 2 评论 -
list容器方法总结——中文博客最清晰完整的整理
list注:*标记的为c++11新特性,构造函数默认为c++11函数原型省略了一些细节,只展示实际需要填写的情况(分配器已经隐藏了,需要可以去c++reference查看)参数栏表示传入的两个参数的意义而不是类型返回值栏表示类型而不是意义粉红色表示为c++11新特性构造函数方法(method)原型(prototype)参数(param)返回值(return)功能(function)构造函数explicit list (const allocator_type&原创 2022-04-06 22:05:44 · 846 阅读 · 0 评论 -
容器unordered_map方法总结——中文博客最清晰完整的整理
unordered_map注:*标记的为c++11新特性,构造函数默认为c++11函数原型省略了一些细节,只展示实际需要填写的情况(分配器已经隐藏了,需要可以去c++reference查看)参数栏表示传入的两个参数的意义而不是类型返回值栏表示类型而不是意义粉红色表示为c++11新特性参数若标黄,则可以不填unordered_map 以下简称um构造方法方法(method)原型(prototype)参数(param)返回值(return)功能(function)原创 2022-03-27 00:05:30 · 355 阅读 · 0 评论 -
set容器方法总结——中文博客最清晰完整的整理
set注:*标记的为c++11新特性,构造函数默认为c++11函数原型省略了一些细节,只展示实际需要填写的情况(分配器已经隐藏了,需要可以去c++reference查看)参数栏表示传入的两个参数的意义而不是类型返回值栏表示类型而不是意义粉红色表示为c++11新特性构造函数方法(method)原型(prototype)参数(param)返回值(return)功能(function)构造函数explicit set (const key_com原创 2022-03-14 23:37:24 · 1174 阅读 · 0 评论 -
array容器方法总结——中文博客最清晰完整的整理
array注:array是c++11特有函数原型省略了一些细节,只展示实际需要填写的情况(分配器已经隐藏了,需要可以去c++reference查看)参数栏表示传入的两个参数的意义而不是类型返回值栏表示类型而不是意义构造函数&迭代器方法方法(method)原型(prototype)参数(param)返回值(return)功能(function)构造函数template < class T, size_t N > class array;无d原创 2022-03-13 22:59:27 · 2617 阅读 · 0 评论 -
queue容器方法总结——中文博客最清晰完整的整理
注:*标记的为c++11新特性,构造函数默认为c++11函数原型省略了一些细节,只展示实际需要填写的情况(分配器已经隐藏了,需要可以去c++reference查看)参数栏表示传入的两个参数的意义而不是类型返回值栏表示类型而不是意义粉红色表示为c++11新特性构造函数方法(method)原型(prototype)参数(param)返回值(return)功能(function)构造函数explicit queue (const container原创 2022-03-12 22:01:40 · 898 阅读 · 0 评论 -
stack容器方法总结——中文博客最清晰完整的整理
stack注:*标记的为c++11新特性,构造函数默认为c++11函数原型省略了一些细节,只展示实际需要填写的情况(分配器已经隐藏了,需要可以去c++reference查看)参数栏表示传入的两个参数的意义而不是类型返回值栏表示类型而不是意义粉红色表示为c++11新特性构造函数方法(method)原型(prototype)参数(param)返回值(return)功能(function)构造函数explicit stack (const con原创 2022-03-10 23:03:00 · 739 阅读 · 0 评论 -
vector容器方法总结——中文博客最清晰完整的整理
对vector的方法进行整理原创 2022-03-08 20:19:53 · 344 阅读 · 0 评论 -
Algorithm第四版算法 C++实现(三十)——LZW压缩(文件压缩)
LZW压缩就是用12个字符的宽度来表示某一前缀码的字符。class LZW{ int r = 256; int l = 4096; //总大小 int w = 12; //位宽public: void compress(std::string input) { TST<int> st; for (int i = 0; i < r; i++) { st.put(std::to_string(i), i); } int code = r + 1;原创 2021-08-29 20:02:14 · 226 阅读 · 0 评论 -
Algorithm第四版算法 C++实现(二十九)——霍夫曼(Huffman)压缩(文件压缩机制)
霍夫曼压缩真的式一个非常经典又非常优雅的算法。不知道大家是否都会求霍夫曼树。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。如果清楚的话,建议先去看一下霍夫曼树。他的原理是,将数据从小到大排序,将最小的两个生成一棵树,其权为二者的和。然后将其加入到队列中与其他的比较并继续此过程。然后我们可以根据生成的树来获取前缀码。然后用这些代码代替原本的数据。class huffman{private: const static int r = 256; int freq[256] = {};原创 2021-08-28 23:27:37 · 503 阅读 · 2 评论 -
Algorithm第四版算法 C++实现(二十八)——游程编码(二进制文件压缩机制)
游程编码的原理很简单,他适用于以零开头的二进制文件的压缩,原理就是统计有多少个0,或1,将其转化为数字。需要压缩的文件000000000001111111111111111000000001111111110000000000000000000011111111111000000000000000000011111111111100000000000111111111111100000000000011111111111需要解压的文件11 168 9 911 11 811 121原创 2021-08-27 22:40:03 · 1322 阅读 · 0 评论 -
Algorithm第四版算法 C++实现(二十八)——NFA(非确定有限状态自动机)正则表达式匹配模式
正则表达式相比大家都很熟悉,rege(regular expression)早在unix时代就已经出现,非常的常用。这是正则表达式的原理,NFA(非确定有限状态自动机),与KMP算法的原理类似,不同点是,因为或的存在,我们不能仅仅根据一个字符就推断出模式是否存在。所以我们需要NFA。不过在处理NFA之前,我们需要先把正则表达式进行处理,方法和dijkstra双栈算法非常相似(在学习栈的时候介绍过,处理运算表达式的算法)。经过这样的处理之后,我们再用有向图构造出自动机的模式,就可以用来匹配了。class N原创 2021-08-26 18:58:40 · 458 阅读 · 0 评论 -
Algorithm第四版算法 C++实现(二十八)——Rabin Karp算法(指纹字符串查找算法)
字符串没法直接进行比较,但是数字可以直接进行比较,那我们能不能把字符串转换为数字并比较是否相等呢?答案事肯定的。但是求出其散列表相同的字符串并不一定就相同(如果用的是几何加减法),比如ac和ab,ac和ca,都是相同的。用其他的处理方法也极有可能出现不同字符串相同散列值的情况,所以我们需要对符合匹配的字符串进行检查。class rabinkarp{private: std::string pat; //模式字符串 long long pat_hash; //模式字符串的散列值 int m;原创 2021-08-25 20:12:30 · 342 阅读 · 0 评论 -
Algorithm第四版算法 C++实现(二十七)——Boyer Moore算法(子字符串查找)
Boyer Moore算法其实也是从上期的算法中得到了其实,但是这个算法的进步可要比之前的算法大的多。他会将需要查找的子字符串解析处理,将某个字符出现的最右侧的位置记录下来,然后如果我们匹配失败,就可以根据这个信息回退了。显然,如果我们已经匹配的字符串中如果没有重复的内容,那么从子字符串到匹配失败的位置都不会由符合子串的内容。我们的right数组只是考虑了有重复的情况而已。如果有和失败处的字符相同的,那我们就把他移动到与哪个字符相同的位置继续匹配就好了。class boyermoore{private原创 2021-08-24 15:51:59 · 228 阅读 · 0 评论 -
Algorithm第四版算法 C++实现(二十六)——KMP算法(子字符串查找)
在很多时候,我们都需要寻找某个字符串的子字符串,这在统计,内容查找,内容审视上都是很重要的。但是查找子字符串的暴力破解法所需要的时间复杂度难免太多,最坏的情况下其时间复杂度竟高达MN!为了加快我们的算法的速度,我们会通过控制回退的方式来减少比对的次数,但是这种朴素的方式取得的效果有限不过这种方法给了我们一个启示,让我们发展出了KMP算法。简而言之,KMP算法就是解析需要查找的子字符并设置出需要回退的步数,毕竟我们能够得知于子字符串匹配中的几个字符的值。这样就能减少回退的次数。/*KMP字符串查找*原创 2021-08-23 19:40:22 · 238 阅读 · 0 评论 -
Algorithm第四版算法 C++实现(二十五)——单词查找树(基于单词查找树的符号表,基于三向查找树的符号表)
基于单词查找树的符号表这种方法其实也很简单,我们把每个节点都设置256个子节点,然后将字符串往里面插入就行了/*基于单词查找树的符号表*/template<typename V>class trie{private: const static int r = 256; struct node { V value; node next[r]; } *root; node *get(node *x, std::string key, int d) { if (x原创 2021-08-22 22:17:23 · 239 阅读 · 0 评论 -
Algorithm第四版算法 C++实现(二十四)——三向字符串快速排序
可以说,这个排序算法是一个相当成熟的排序算法,和快速排序非常的像,但是针对字符串进行优化,速度会更快。而且更让人满意的是他的性能和速度,而且非常容易实现,不容易出错,最为推荐的字符串排序算法class q3s{ int charat(std::string s, int d) { if (d < s.length()) return s[d]; else return -1; } void swap(std::string *s, int a, int b) {原创 2021-08-21 12:20:31 · 200 阅读 · 0 评论 -
Algorithm第四版算法 C++实现(二十三)——高位优先的字符串排序
高位有限的字符排序与地位有限的字符排序相比,可以对长度不等的字符串进行排序,同时,其稳定性也更好。与低位优先排序算法的原理相似。/*高位优先的字符串排序算法*/class MSD{private: const static int r = 256; const int m = 3; std::vector<std::string> aux; int charat(std::string s, int d) { //printf("%d",s.length()); if原创 2021-08-20 16:24:44 · 227 阅读 · 0 评论 -
Algorithm第四版算法 C++实现(二十二)——低位优先的字符串排序
低位优先的字符串排序会从后往前比较各个字符串的当前位字符大小void LSDsort(std::string *a, int w){ int n = a->size()+1; //数组长度,即字符串个数 //printf("%d", n); const int r = 256; std::string *aux; aux = new std::string[n]; for (int d = w - 1; d >= 0; d--) { int count[r + 1] =原创 2021-08-19 17:45:57 · 136 阅读 · 0 评论 -
Algorithm第四版算法 C++实现(二十一)——bellman-find算法(带权图最短路径算法)
bellman-find算法与dijkstra算法有一点相似,不过我们在这个算法中维护了一个队列来进行下一步的遍历。但是bellman-find算法也有一个局限,便是不呢处理具有负权重环的图。/*bellman - find算法*/class bellman_find{private: double *dist_to; //路径长度 std::vector<diedge> edge_to; bool *onq; std::queue<int> q; int cost原创 2021-08-18 14:48:35 · 183 阅读 · 0 评论 -
Algorithm第四版算法 C++实现(二十)——dijkstra算法(带权图最短路径算法)
class diedge{private: int v; int w; double wei;public: diedge(int from, int to, double weight) { this->v = from; this->w = to; this->wei = weight; } diedge() { v = 0; w = 0; wei = inf; } double weight() { return wei; }原创 2021-08-17 08:24:47 · 324 阅读 · 0 评论 -
Algorithm第四版算法 C++实现(十九)——Prim算法(求最小生成树)
Prim算法的原理是将某点与其他点最短的链接建立起来,遍历完v-1个点之后自然就可以生成一颗权重最小的树。静态prim算法class prim{private: std::vector<edge> pq; bool *marked; //标记是否访问 std::vector<edge> mst; //最终路径 void visit(EWgraph g, int v) { marked[v] = true; for (edge e : g.iterator(v原创 2021-08-15 15:44:43 · 249 阅读 · 0 评论 -
Algorithm第四版算法 C++实现(十八)——加权无向图的构造及kruskal算法(求最小生成树)
带权边的构造/*带权图的边*/class edge{private: int v; int w; double wei;public: edge(int v, int w, double weight) { this->v = v; this->w = w; this->wei = weight; } double weight() { return wei; } int either() { return v; } int othe原创 2021-08-14 14:54:21 · 309 阅读 · 1 评论 -
Algorithm第四版算法 C++实现(十七)——kosaraju算法(计算强连通分支量)
强连通图(图指有向图):图中任意两点双向可达强连通分支:图里与自己内部强连通但与整个图的其他部分不强连通的子图kosaraju算法通过两次DFS来实现,第一次对有向图D进行搜索,并标记顺序;第二次对有向图D的反图(见有向图的构造revers方法)进行搜索。从构造函数进入dfs函数之后,只要不退出则说明之后遍历的都是连通的。class kosaraju{private: bool *marked; int *id; int count; void dfs(digraph g, int v)原创 2021-08-13 13:50:23 · 479 阅读 · 0 评论 -
Algorithm第四版算法 C++实现(十六)——拓扑排序(调度问题)、环和无环有向图
在现实中,我们经常会遇到如图所示问题这张图指明了想要完成指定的任务所需完成的前置任务。这种问题叫做调度问题。我们需要得知如何安排才能使得所有任务顺利完成。这就叫做优先级限制下的调度问腿拓扑排序:给定一副有向图,将所有顶点排序,使得所有有向边均从排在前面的元素指向排在后面的元素要解决调度问题,首先我们需要确定图中有没有环。很明显,当有向图种存在环时,调度问题是无解的。有向环检测//寻找有向环class directedcycle{public: directedcycle(digraph原创 2021-08-12 18:29:42 · 413 阅读 · 0 评论 -
Algorithm第四版算法 C++实现 索引
这篇博客旨在为我之前写的几篇博文和以后会写的博文提供一个索引。这些博文会用C++语言改写Robert Sedgewick 与 Kevin Wayne 的著作Algorithm(4th)的部分算法。所以这些文章都不会对算法做出很详细的解释。如果有需要还请查找相关算法更详细的内容。该博文对书本起辅助作用。(这本书写的还算不错,不确定买哪本算法书的可以考虑下)章节算法(点击超链接可跳转)描述基础union-find算法求连通分支数排序基础排序算法选择排序插入排序希尔排序原创 2021-08-11 21:48:51 · 249 阅读 · 0 评论 -
Algorithm第四版算法 C++实现(十五)——使用邻接矩阵法构造有向图及有向图的搜索
有向图,即边有方向的图。你也可以把无向图理解为是两个顶点之间都有两条反向的平行边的有向图。有向图的构造与无向图的构造很相似。值得注意的是多了一个reverse方法class digraph{private: int v; int e; std::vector<std::vector<int>> adj;public: digraph(int v) { this->v = v; this->e = 0; adj.resize(v); }原创 2021-08-10 14:15:30 · 319 阅读 · 0 评论 -
Algorithm第四版算法 C++实现(十四)——广度优先搜索(BFS)
既然上一期说了DFS,这一期当然要来说BFS了。广度优先搜索和DFS还是很相似的,只不过我们会先找出和起点相邻的顶点,然后再依次进入这些顶点,并找到所有与其相邻的顶点,重复上述步骤直到该连通分支的所有节点都被标记。作者很巧妙的利用了queue的FIFO特性来实现广度优先搜索。(我用STL不是因为懒哈)路径:in head.hclass BFS{private: bool *marked; //标记数组 std::vector<std::string> path; //标记路径的原创 2021-08-09 22:48:10 · 182 阅读 · 0 评论 -
Algorithm第四版算法 C++实现(十三)——深度优先搜索(DFS)
深度优先搜索,即DFS(depth first search)是一种图的搜索方法,一般使用递归实现。深度优先搜索的原理很简单,即从一个点开始,将这点标记为已搜索,然后找到与该点链接的顶点,再在该顶点继续上述操作。直到我们走到的顶点没有与其链接的未标记顶点时,往前回溯,再继续搜索,直到搜索完该点所在的连通分支的全部节点。in algorithm.hclass DFS{public: DFS(graph g,int s); int num() { return count; }priv原创 2021-08-08 16:03:29 · 315 阅读 · 0 评论 -
Algorithm第四版算法 C++实现(十二)——使用邻接矩阵法构造无向图
图是一种非常常见的数学模型。图在各种应用中都有非常重要的作用我们今天要介绍的图叫做无向图,在无向图中,边仅仅起到链接两个顶点的作用。这是一种简单的图模型。术语解释:自环:一条链接一个顶点与他自身的边平行边(无向图):两条及以上关联同一对顶点的无向边多重图:有平行边的图简单图:无平行边的图度数(度):点作为边端点的次数//邻接矩阵法构造无向图class graph{private: int v; //顶点数 int e; //边数 std::vector<std::vec原创 2021-08-07 15:57:38 · 570 阅读 · 0 评论 -
Algorithm第四版算法 C++实现(十一)——基于线性探测法的散列表(Hash table)
线性探测法的原理也很简单,当俩个键的储存位置发生冲突时,我们就把储存值的键+1,这样就能解决键冲突的问腿了。当然,这样就会导致我们的数组的容量可能会不够用,这就需要动态的调整数组大小了(这就显现出我使用vector容器的厚颜无耻先见之明了 )。对比拉链法,线性探测法的删除操作比较重要,建议大家细看一下(详情见代码注释)template<typename T, typename V>class LPhashST{private: int n; //键值对总数 int m = 16;原创 2021-08-06 21:18:32 · 428 阅读 · 0 评论 -
Algorithm第四版算法 C++实现(十)——基于拉链法的散列表(Hash table)
要构造一个散列表,第二步(第一步比较简单就不说了,主要是得到hashcode与构造哈希表)也是最关键的一步就是碰撞处理。一种直接的办法就是将大小为M的数组中的每个元素都指向一条链表(此处用二维数组来表示),链表中每个结点都储存了散列值为当前键的值,这种方法叫做拉链法。template<typename T,typename V>class hashST{public: hashST(int m) { this->m = m; st.resize(m); } V g原创 2021-08-05 17:43:55 · 353 阅读 · 0 评论 -
Algorithm第四版算法 C++实现(九)——红黑树
红黑二叉查找树,简称红黑树。红黑树是2-3树的一种实现方法。2-3树所谓2-3树,就是 *2-节点(一个键与两条链接)与 3-节点(两个键与三条链接)的树一颗完美平衡的2-3树所有空连接到根根节点的距离应该是相同的由于2-3树的插入代码比较复杂,我在此就不再赘述了,有兴趣的读者可以查阅相关资料由于实现2-3树的代码非常复杂,而且其产生的大量额外开销使得2-3树甚至比普通的二叉树更慢。所以我们必须使用更高效的方式实现他们。于是红黑树就出现了红黑树红黑树就是用普通二叉树与一些额外信息来表示2-3树原创 2021-08-04 22:42:05 · 199 阅读 · 0 评论 -
Algorithm第四版算法 C++实现(八)——二叉查找树(BST/二叉搜索树)
二叉搜索树是一种重要的数据结构,也是计算机科学最重要的算法之一。我们用二叉搜索树实现符号表将会使得查找的速率非常的高。因为书中并没有给出API列表,所以我将简单的列一下书中出现的接口API功能int size()返回树大小V get(T key)根据键获取值void put(T key, V value)插入一对键-值T min()返回最小键T max()返回最大键T floor(T key)返回下界的键T ceiling(T key)原创 2021-08-03 22:35:22 · 163 阅读 · 0 评论 -
Algorithm第四版算法 C++实现(七)——二分查找
二分查找是一种基础又重要的算法,能够快速锁定某个值在 有序 列中的位置。其原理与我们在中学数学中学到的二分法是相同的,即先找到中间值,如果中间值大于目标值,则在最小值与中间值之间继续二分查找;如果中间值小于目标值,则在中间值与最大值之间继续二分查找。书中给出了两种实现方法,分别是迭代与递归,这里更推荐使用迭代实现P.S. 这里未命中会一直递归,推荐对代码做成相应更改,并用return -1表示未命中。详见注释template<typename key>int binary_search原创 2021-08-02 12:51:52 · 232 阅读 · 0 评论 -
Algorithm第四版算法 C++实现(六)——优先队列
在书中,优先队列使用二叉堆来实现。所以这个优先队列是基于堆的优先队列template<typename key>class maxPQ{private: key pq[]; int n = 0; bool less(int i, int j) { return pq[i] < pq[j]; } void swap(int i, int j) { key temp = pq[i]; pq[i] = pq[j]; pq[j] = temp; } voi原创 2021-08-01 09:16:36 · 151 阅读 · 0 评论 -
Algorithm第四版算法 C++实现(五)——堆排序
堆排序是一种基于优先队列的排序方式class sort{public:void heap_sort(std::vector<T> &a) //n为数组长度 { int n = a.size(); int i; /*初始化堆*/ for (i = n / 2; i >= 0; i--) //根据数学,2^n/2=2^(n-1),二叉树最底层的元素的量是上层元素的量+1 percdown(a, i, n); /*排序*/原创 2021-07-31 08:49:31 · 137 阅读 · 0 评论 -
Algorithm第四版算法 C++实现(四)——快速排序
快速排序是一种分治法的排序,与归并排序是互补的。归并排序是将序列分成子序列,将有序的子序列归并为整个序列。而快速排序则是当子序列都有序的时候,整个数组自然就有序了。template<typename T>class sort{public: void quick_sort(std::vector<T> &item,int low,int high) { if (high <= low) return; int j = partiti原创 2021-07-30 09:06:49 · 168 阅读 · 0 评论 -
Algorithm第四版算法 C++实现(三)——归并排序
要将一个序列排序,可以先将他划分为两部分,然后再将结果归并起来简单来说,归并排序就是使用递归的方法,将序列逐步化小,进行排序后再进行归并这种排序方法,所需时间与NlogN成正比,但需要的额外空间较多自顶向下的归并排序main中调用部分已经省略template<typename T>class sort{ std::vector<T> a; std::vector<T> aux;public: void merge_sort(std::vector&l原创 2021-07-28 22:29:02 · 149 阅读 · 0 评论 -
Algorithm第四版算法 C++实现(二)——初级排序算法(选择排序、插入排序、希尔排序)
排序是将一组对象按照某种逻辑顺序重新排列的过程。排序算法常常是解决其他问题的第一步。选择排序找到最小的元素与第几个元素交换位置main.cpp#include <iostream>#include "head.h"using namespace std;int main(){ vector<char> s; s.resize(11); for (int i = 0; i < 11; i++) { cin >> s[i]; } sort原创 2021-07-27 08:28:12 · 164 阅读 · 0 评论