自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(49)
  • 收藏
  • 关注

原创 创建日期类、const成员函数

这样去写代码,要声名是在Date类中的。将const修饰的类成员函数称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。缺省参数在.h文件和.cpp文件中不能都有,一般是在.h的声名中声名缺省值,在.cpp中不写缺省参数。下述代码就直接实现了,不写.h文件的东西。const在*之前修饰的是指针指向的对象,在之后修饰的是指针本身。在下面的代码期望的是const限定this指针指向的内容不被修改。

2024-10-10 17:42:13 135

原创 构造、析构、拷贝构造、赋值运算符重载

无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。注意:无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为是默认成员函数。析构函数:与构造函数功能相反,析构函数不是完成对象的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成类的一些资源清理工作。构造函数是特殊的成员函数,需要注意的是,构造函数的虽然名称叫构造,但是需要注意的是构造函数的主。类里面的成员函数什么都不写的时候,编译器会自动生成6个成员函数。(可以有多个构造函数)

2024-09-29 20:00:50 269

原创 类和对象1

和class是定义类是一样的,区别是struct的成员默认访问方式是public,class是struct的成员默认访问方式是private。类中,使用类数据和方法都封装到一下。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间。一个类的大小,实际就是该类中”成员变量”之和,当然也要进行内存对齐,注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类,这里就是1。

2024-09-29 16:43:28 874

原创 域 缺省参数 函数重载 引用

如果用C++写的程序提供接口函数给使用者,C++使用者可以直接使用,但如果是一个C使用者调用函数会找不到地址,因为在汇编过程中C使用不修饰的函数名找调用函数,而C++在汇编会产生修饰的函数名,因此无法调用。引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。有时候在C++工程中可能需要将某些函数按照C的风格来编译,在函数前加extern “C”,意思是告诉编译器,将该函数按照C语言规则来编译,不要用C++的规则修饰函数名去编译。

2024-09-27 20:03:34 1232

原创 排序的总结

之前的排序中,都是只能内排序,只有归并排序可以内也可以外排序。归并排序的思想可以应用在外排序中。数组中相同的值排完序以后相对顺序不变就是稳定的,否则是不稳定的。外排序:数据量较大,内存中放不下,数据放到磁盘文件中排序。内排序:数据量相对少一些可以放在内存中排序。冒泡插入归并是稳定排序,其他不是。

2024-09-26 19:38:49 230

原创 归并排序,外排序,计数排序(非比较排序)

归并排序:(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。1.最后一个小组归并时,第一个小区间不够gap个,则不需要归并 不处理时OK的 因为他同样满足第二个小区间不存在,因此不处理OK。代码控制中有个gap,gap是1 就是11归(两个相比),gap是2就是22归(四个相比), gap是4就是44归(八个相比)。也就是:假设左边有序,右边有序,然后合并在一起归并后就有序。快排是前序,归并是后续。

2024-09-26 17:18:24 350

原创 排序(交换排序:快排)

如果是right先走,最坏在遇见left的时候停止,而这个位置是left的位置,值肯定是比key小的,但left先走的话,最坏情况遇见right,此时值是比key大的,交换会出问题。挖坑法:将key的位置看作是一个坑(hole),然后利用part1的思路,找到大的将值放进坑中,然后此时right就是hole,再找小的值,将小的值放进hole中,此时left是坑…理想的情况下:每次排序都是二分,直到二分到最后,那就相当于递归高度次(logN),每一层单趟排都是O(N),时间复杂度O(N。

2024-09-25 16:01:52 383

原创 排序(插入,希尔,堆排,冒泡)

直接插入排序:是一种简单的插入排序法,其基本思想是:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列。时间复杂度:原数组如果和需要排的顺序逆序的时候是最坏的情况,O(N^2),和冒泡排序时间复杂度相同。蓝色的整体为一组,红色的整体为一组,绿色的整体为一组。每次比较的时候只比较各自颜色指向的数字,以蓝色为例,也就是9,5,8,5相比较后进行排序。gap越大,说明大的数和小的数可以更快的挪到对应的位置,但gap越大越不接近有序。

2024-09-24 20:41:28 474

原创 二叉树的广度优先遍历和题目

二叉树广度优先遍历利用队列 。typedef char BTDataType;typedef struct BinaryTreeNode{ BTDataType data; struct BinaryTreeNode* left; struct BinaryTreeNode* right;}BTNode;typedef BTNode* QDataType; // 链式结构:表示队列 typedef struct QueueNode { struct QueueNode* ne

2024-09-18 18:26:13 307

原创 二叉树的链式结构和递归程序的递归流程图

二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址。链式结构又分为二叉链和三叉链,当前学习二叉链。如果是为了存储数据,线性表更简单,二叉树更复杂,并且插入删除也不好定义。有意义的是通过二叉树引出搜索树,搜索树又有AVL树和红黑树。前中后序的本质是一样的,就是打印的时机不同。深度就是 左边的深度 和 右边的深度 更深的那一个在加1 就是这层现在的深度。

2024-09-18 15:17:10 414

原创 堆排序的实现和TopK问题

2.把剩下的N-K个数据,和堆顶数据进行比较,如果比堆顶的数据小,则替换堆顶的数据,调堆。空间复杂度:O(K)。如果数组的N很大,100亿个数(40个G空间),求K=10前十个最什么的数。堆排序:排升序建大堆,第一步需要先建堆 时间复杂度是O(N)。直接选择排序的时间复杂度O(N^2)。因此整个排序的时间复杂度为堆排序的时间复杂度加上调整的时间复杂度:O(N。在极端情况下,每个点都进行向下调整的话,调整的时间复杂度是O(N。也就是求前K个最大的或者最小的数。最小的K个数来了,一定比堆顶的数大,就可以进堆。

2024-09-13 15:30:56 212

原创 建堆内容的实现

父亲的下标是P,则左孩子的下标为 lc = 2P + 1,右孩子的下标为 rc = 2P + 2。C是左还是右孩子无所谓。因此,堆排序排升序得建大堆。堆排序的时间复杂度是O(longN)。大堆只需要把子节点的大的值选出来往上调就是大堆的构造。堆排序:需要先建堆,排升序建大堆。当数组不是小堆后->创建小堆。

2024-09-12 15:56:38 126

原创 二叉树和堆概念

假设度为0的节点有a0个,度为1的节点有a1,度为2的节点有a2个,767 = a0 + a1 + a2 = 2a0 + a1 - 1,如果a1 = 1,则不匹配左边,所以a1 = 0。若规定根节点的层数为1,具有n个结点的满二叉树的深度,h=Log2(n+1). (ps:Log2(n+1)是log以2为。假设度为0的节点有a0个,度为1的节点有a1,度为2的节点有a2个,所以2n = a0+a1+a2。即:K层的树,前K-1层都是满的,只有K层不满,但最后一层是需要从左到右连续的。层数是从1开始数的。

2024-09-12 14:24:29 567

原创 树的一些内容

双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点;如上图:B是A的孩子节点。叶节点或终端节点:度为0的节点称为叶节点;子孙:以某节点为根的子树中任一节点都称为该节点的子孙。非终端节点或分支节点:度不为0的节点;兄弟节点:具有相同父节点的节点互称为兄弟节点;节点的祖先:从根到该节点所经分支上的所有节点;节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;节点的度:一个节点含有的子树的个数称为该节点的度;

2024-09-12 12:38:26 163

原创 实现支持动态增长的栈和队列

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则(对于同时在栈里面的数据,后进栈的必须先出栈)。如果用单链表作为结构,每次进行数据的头插,让头插的数据作为新的头,为栈顶,让以前进入的数据为栈低。队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数。队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出。出3后,不可能出1,因为2卡着。

2024-09-11 18:18:30 141

原创 顺序表和链表的优缺点对比

2.CPU高速缓存命中率比较高(CPU通过寄存器在内存中遍历顺序表和链表的过程中,顺序表的速度比较快。数据在寄存器缓存中,称为命中,不在缓存不叫命中。因为顺序表空间连续,如果一次加载16byte,可以把顺序表很多数据都换存进去,但是链表空间不连续,他不太会被一次缓存进去。链表是低命中还存在缓存污染。1.按需求申请内存,需要存一个数据就申请一块内存,也不存在浪费。2.在头部和中间插入数据,需要挪动数据,效率低,O(N)2. 在任意位置O(1)的时间内插入删除数据。1.不支持下标的随机访问。

2024-09-10 13:01:24 150

原创 带头双向循环链表

双向带头循环链表每次传一级指针就可以了,因为带头,每次头可以指对方向。ListInsert和ListErase比较好用,可以复用删除和插入所有位置。

2024-09-09 17:04:51 213

原创 链表题目解析

链表题目

2024-09-09 12:37:39 320

原创 链表的结构及单向不带头不循环链表

单项不带头不循环(对于下述代码的pplist参数,均需要在创建节点后,对结点指针再传递指针,也就是需要传递二级指针(&plist)进行使用。双向链表:具有数据域和指针域,分别有指针域指向下一个节点和上一个节点的地址。单链表的结构:具有数据域和指针域,指针域指向下一个节点的地址。phead:头指针 存放链表的第一个节点的地址。单链表带头节点的结构,头节点不存放有效数据。循环链表:最后一个节点指向头节点。但其实数据的存储不连续。1.无头单向非循环链表,2.带头双向循环链表,

2024-09-04 22:09:59 175

原创 布隆过滤器和位图

hash

2022-01-19 22:20:20 344

原创 信号量:基于semaphore中sem值设置为1,构造一个拟互斥锁

用sem(1)初始化,构造一个互斥锁的抢票系统

2021-12-01 21:20:37 184

原创 linux生产者消费者模型

linux实现一个线程间的合作处理。对于线程c,p。。。。c是消费者,p是生产者。生产一批数据然后消费。每次得有阻塞等待线程锁被唤醒。这里的参数就不是数据了而是一个执行流代码实现如下:Task.hpp代码 1 #include <iostream> 2 using namespace std; 3 4 5 class Task 6 { 7 public: 8 Task(int x,int y,char op) 9

2021-11-29 23:13:38 384

原创 【无标题】

linux线程等待,cond和lock配合使用小练习 1 #include <iostream> 2 using namespace std; 3 #include <pthread.h> 4 #include <string>

2021-11-28 23:25:43 68

原创 linux-信号

信号闹钟操作 alarm(n) 闹钟,等s之后跳到闹钟结束进程linux 代码:让进程在1s后听到闹钟停止,打印count; 如果这1s内连续打印,因为有i/o count只到十几万,但是1s中自增时候没有打印,可以到几亿; 1 #include <stdio.h> 2 #include <unistd.h> 3 #include <stdlib.h> 4 #include <sys/types.h> 5 #inc

2021-11-13 17:47:59 866 1

原创 信号 kill -l

信号的linux操作13行:signal是重定义自定义哪个信号的怎样执行方法。这样子重定义之后,2号信号就不是中断了,而是打印上面的信息,我只是随便写了个,以方便测试。18行://这个代码是测试过core文件的截取,截取到后可以直接追踪到该错误信息处。//ulimit -a 查看core文件截取的方法是否打开,//ulimit -c (大小) 用来开启 core file size 的大小。 2 #include <stdio.h> 3 #include <sig

2021-11-10 22:52:02 757

原创 走迷宫问题。。字符串距离

字符串距离也是用str1的每个数据和str2比较,一层一层的下去 从每层元素的左边和上边两个位置找到最近的的位置,这样都能保证最后走到的是最小的位置,想起来可能比较抽象,但是画图之后,想想确实是这个道理。代码如下://字符串的距离int min(int x, int y){ return x < y ? x : y;}int main(){ string str1, str2; while (cin >> str1 >> str2) { int le

2021-11-09 19:48:27 76

原创 输出两个字符串的相同字符串的个数

eg:asdfaswerasdfaswer输出6我是用两个指针来操作的xs是长的字符串,ns是短的那个。因为每次从短的开始,遍历长字符串开始的头部,大的需要遍历短字符串的元素个数次。小的 每次从短的开始便利长字符串,相同啧开始一同向后遍历,如果长的不会遍历完全,则需要让短的在指向刚开始,长的从上次遍历的下一个位置开始遍历。#include <iostream>#include <string>using namespace std;int main(){ s

2021-11-03 18:46:17 983

原创 练习题,做错的不会的

一static int a = 1;void fun1(){ a = 2; }void fun2(){ int a = 3; }void fun3(){ static int a = 4; }int main(){ printf("%d", a); fun1(); printf("%d", a); fun2(); printf("%d", a); fun3(); printf("%d", a); return 0; // 1 2 2 2}static局部变量一旦成

2021-10-28 17:25:02 86

原创 跳石板问题,和一些选择题。

跳石板正确解法void get_div_num(int q, vector<int>& a){ for (int i = 2; i <= sqrt(q); ++i) { if (q%i == 0) { a.push_back(i); if (q / i != i) a.push_back(q / i); } }}int Jump(int n, int m){ vector<int > step(m + 1, INT_

2021-10-27 16:24:04 73

原创 linux进程间通讯,(父子进程间)

管道通讯(父读子写)互斥:任何时刻只能有一个人正在使用某种资源管道内部自动提供了互斥与同步机制如果写端关闭,读端就会read返回值0,代表文件结束如果打开文件的进程退出,文件也会被释放文件的生命周期随进程<管道的流式服务>管道是半双工,就是数据只可以向一个方向流动匿名管道,适合具有血缘关系的进程进行进程间通讯read :没有内容挂起write:没有空间挂起如若管道没有父进程读,就会读文件错误。read关闭,一直写,写方(child)被操作系统杀掉,写入无意义linux实

2021-10-25 22:27:13 599

原创 做题修正的正确答案

求一个int类型数字对应的二进制数字中1的最大连续数,例如3的二进制为00000011,最大连续2个1 空间复杂度O(1)这个是不能是负数的操作,如果是负数,一直补符号位导致无法结束循环。int Max(int a, int b){ return a > b ? a : b;}int main(){ int num; while (cin >> num) { int count = 0, max_count = 0; while (num) { if

2021-10-25 19:34:45 168

原创 2021-10-19

求连续子数组最大和int Getmax(int a, int b){ return a > b ? a : b;}int main(){ int size = 0; cin >> size; vector<int> nums(size); for (int i = 0; i < size; ++i) { cin >> nums[i]; } int sum = nums[0]; int max = nums[0]; for

2021-10-19 22:46:54 103

原创 红黑树的插入和删除

RBTRee 插入节点:首先用BSTree的方法构造节点,然后创建一个真实的空节点,让所有没有真是子节点的节点都指向这个真实的空节点,而不是nullptr。插入之后的调平颜色和高度是问题的关键。以左子树为例,右子树为镜像操作。先找到叔伯节点,若叔伯节点不为空且颜色为红色,则父节点颜色改为黑色,叔伯节点变为黑色,爷爷节点变为红色,然后插入节点由原来的位置变成爷爷节点,然后向上回溯。这是一种情况。左边的直线插入 ‘ / ’ ,将父节点的颜色变为黑色,爷爷节点的颜色变成红色,然后进行一个右单旋转。如果是

2021-08-04 23:43:32 140 1

原创 AVLTree的编写规则

AVLTree 高度平衡的二叉搜索树 平衡因子 bf = rh - lh即利用bf=根节点的右树长度-左树长度的正负值,来将极端情况下的BSTree调节平衡。在AVLTree中,调节过程需要用到stack,stack先把插入的地址都存入栈中,直到不平衡出栈,找到父节点。‘ \ ’ 左单旋转 , ‘ / ’ 右单旋转 。‘ > '先右后左 , ‘ < ’ 先左后右 。Remove 的节点 最多只能有一个子女节点,如果没有,利用左右子节点调整数值。本次利用找到左子树的右子树的最大值

2021-08-02 23:00:27 82

原创 继承---目的:复用代码

继承:可以理解为将弗雷德代码拷贝一份给子类,但是构造和析构函数不可以继承。子类可直接调用父类的方法(公有方法)。保护方法可以在子类中用子类的方法调用父类的保护方法。保护继承会将父类的公有方法变成保护方法。(私有同样的性质 继承最小性原则)。父类的私有数据不可以访问如果不写继承方法,则默认为私有继承。struct是公有继承’复制件用性原则:子类对象可以以对象,指针,引用的方法给父类赋值。子类与父类有同名的方法则用子类访问时,访问的是子类的方法如果同名方法中子类给父类赋值后,同名访问父类方法

2021-07-19 00:12:59 75

原创 剑指offer 求1+2+3+...+n

要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)class Solution {public: class Sum { public: Sum() { _sum += _i; _i++; } }; int Sum_Solution(int n) { _i = 1;

2021-06-18 15:42:00 52

原创 文件管理操作之c++版本 cpp和流操作

首先来看一下c语言的操作//c语言的写入void main(){ int ar[] = { 10, 11, 22, 33, 44, 55, 66, 77, 88, 99 }; int size = sizeof(ar) / sizeof(ar[0]); FILE* fp = fopen("Test1.txt", "w"); assert(fp!=NULL); // "w" 是写入,创建一个fp的txt 功能是写入 for (int i = 0; i < size; ++i) {

2021-06-17 21:22:38 219

原创 模板的使用

先来个模板的随便使用template<typename Type, size_t _N=8>class SeqList{public: SeqList(int sz = SZ_SZIE) { capacity = sz > SZ_SIZE ? sz : SZ_SIZE; base = new Type[capacity]; size = 0; }private: enum{SZ_SIZE = 8};private: Type* base; size_t

2021-06-15 23:40:08 74

原创 priority_queue实现

废话不多说,直接上实现的代码要想实现这个,对于优先级的把控,操作得理解清楚相信各位看官仔细想想看我的注释,应该会看懂namespace ghc{ template<class T,class Container = vector<T>,class Compare = less<T>> class priority_queue { public: priority_queue(const T* first, const T* last, const Co

2021-06-11 00:08:07 129

原创 stack_queue的详细解释和使用

stack是栈,没有迭代器,以下是相关代码测试; //stack容器适配器 没有迭代器 不能用auto top:栈顶 pop:出栈namespace ghc{ template<class _Ty> class stack { public: stack()//list自己会做 {} ~stack()//list自己会做 {} public: bool empty()const { return _C.empty(); } size_t s

2021-05-24 15:32:41 167

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除