自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 类型转换 与move

上课笔记

2022-07-08 17:31:10 160

原创 依赖,组合,关联,聚合

对象与对象之间的关系 依赖关系(使用一个) 可能会用到另一个对象 主要体现在的是一种使用关系,当一个对象负责构造另一个对象的实例,或当一个对象依赖于另一个对象所提供的服务时,是依赖关系。 关联关系(使用一个) 是依赖关系的一个特例 弱关联 比如一个对象里面有另一个对象的指针对象,但是你创建对象的时候给不给他都可以,意思就是说一个对象死了,另一个对象还活着 强关联 一个对象有另一个对象的引用。 你在构建对象的时候一定要初始化。 聚合关系(有一个) 圆和点,点是圆的一部分,但是点和圆都可以单独存在,一方死亡,另

2022-05-23 14:32:06 155

原创 条件变量

条件变量 P V 二元信号量(不是零就是一) binary_semaphore semp=1; binary_semaphore sems=1; semp.acquire();1->0 sems.release();0->1; 生产者与消费者 class MySemaphore//实现P操作和V操作 { public: MySemaphore(int val=1):count(1){} void P()//acquire() { std::unique_lock<std::

2022-05-22 17:41:35 178

原创 B树(插入,删除)

B树 B-tree树,一个m阶B数 目录结构 1.根节点子女数为[2,m],m必须是奇数 2.除根结点和叶节点以外的所有分支节点至少右[[m/2],m]个子女 3.所有节点都位于同一层。(天生就是平衡树) 4.m阶B-tree树的节点结构如下 B树的插入 父节点大于左边的子节点,小于右边的子节点。能放数据的只有1,2,3,4. 0号位置是哨兵位,先存在这里面然后和后面的比较啊 父子都有6个节点,0是存刚插入的数据,确定位置后插入,父节点最多存4个节点,当多余4个节点时候就分裂成三个,两个在左两个在右

2022-05-14 20:06:55 776

原创 AVL树 插入

AVL树 一颗AVL树或者空树,它具有二叉搜索树的性质,它的左子树和右子树都是AVL树,且左子树和右子树的高度只差绝对值不超过1 当插入一个值后,左右子树高度差之不小于1,那么就要做平衡处理。 #include<stddef.h> #include<stdio.h> #include<iostream> #include<assert.h> using namespace std; typedef int KeyType; typedef struct AV

2022-05-13 11:56:44 322

原创 类型转换 完美转发 auto nullptr与NULL

C11的特性 类型转换 const int a=10; int* p=const_cast<int*>(a);//去常性转换 p=static_cast<int*>(&a);//类型转换,但是不会成功,普通类型转换 char* cp=reinterpret_cast<char*>(&a);//指针类型转换 Object* op=NULL; Base* bp=NULL; Object obj; Base base; op=dynamic_cast&

2022-05-05 20:58:42 176

原创 BST树:二叉排序树,二叉排序树

BST树:二叉排序树,二叉排序树 根节点比左边大,比右边小 每一个节点都有关键码,都不一样 左右子树也是二叉搜索树 #include<stdio.h> #include<queue> #include<iostream> using namespace std; typedef int KeyType; typedef struct BstNode { KeyType key; BstNode* parent; BstNode* leftchild; BstN

2022-05-04 21:03:39 85

原创 矩阵连乘(递归与非递归)

矩阵连乘 int matrixchain(int i, int j, int p[]) { if (i == j) { return 0; } else { int k = i; int t = matrixchain(i, k, p) + matrixchain(k+1, j, p)+ p[i - 1] * p[k] * p[j]; for (k = i + 1;k < j;++k) { int mt= matrixchain(i, k, p) + matrixc

2022-04-24 22:29:45 226

原创 0_1背包(递归与非递归)

0_1背包 1.从尾部向头部递归 递归 int Knapsack(vector<int>& w, vector<int>& v, int i, int j, int n)//0_1背包,递归写 { if (i == n)//一个物品 { return j >= w[i] ? v[i] : 0; } else { if (j < w[i])return Knapsack(w, v, i + 1, j, n); else { i

2022-04-24 21:48:35 150

原创 list与vector区别,双端队列

int main() { vector<Object> objvec; objvec.reserve(100);//开辟100个对象的空间 objvec.push_back(Object(10));//在尾部插入一个对象,先构建对象,再移动构造对象到尾部,再把原来的无名对象析构 objvec.push_back(20);//同上 objvec.emplace_back(30);//直接在尾部构建对象。 如果在Object的构造函数之前加上explicit,就不能将20直接转换成Obj

2022-04-21 22:40:59 100

原创 动态规划题

动态规划题 int rob(vector<int>& nums)//小偷偷家,不能投相邻两家,要最大金额 { int n = nums.size(); if (n <= 0) return 0; vector<int> dp(n, 0); dp[1] = nums[1]; dp[2] = max(nums[1], nums[2]); for (int i = 3;i < n;++i) { dp[i] = max(dp[i - 1], dp[i

2022-04-20 23:01:43 88

原创 动态规划(生兔子问题 最长公共子序列)

动态规划(最长公共子序列) int LCSLength(const char* X,const char* Y,int m,int n) { if(m==0||n==0)return 0; else { if(X[m]==Y[n])return LCSLength(X,Y,m-1,n-1)+1; else { int max1=LCSLength(X,Y,m-1,n); int max2=LCSLength(X,Y,m,n-1); return max1>max2?

2022-04-17 19:08:44 959

原创 守护进程Linux

1_10守护进程 守护进程:运行周期长,在后台运行,不和用户交互 会话 会话sid 会话首进程的id作为这个会话的id 会话首进程:一般是bash 会话里面有很多进程进程组,进程组的第一个进程id命名这个进程,进程消失,进程组名不变,除非整个进程消失,进程组才会消失。 即使第一个进程消失,会话id不变。 printf("pid=%d,sid=%d,gid=%d\n",getpid(),getsid(0),getpgrp()); 为了防止关闭窗口进程结束,关闭之后重新开辟一个会话,将要守护的进程移到这个进程

2022-04-03 20:37:20 90

原创 2_14shell编程(脚本编程)

2_14shell编程(脚本编程) 像搭积木一样,一层一样 一般是my.sh .sh结尾 chmod u+x my.sh//添加执行权限,Linux可执行文件是以EFL开始的 //添加了执行权限之后就可以用./my.sh执行 bash my.sh //执行 #!/usr/bin/bash //设置解释器 echo "hello" exit 0 c/c++ 编译型:xx.c 编译生成二进制的可执行程序,直接运行可执行程序,因为可直接运行,所以运行效率高一些。

2022-04-03 20:19:30 132

原创 循环引用Child Parent

循环引用 class Child; class Parent { public: my_weak_ptr<Child> c; public: Parent() { cout << "Parent" << endl; } ~Parent() { cout << "~Parent" << endl; } void hi()const { cout << "hello parent" << endl; } }; clas

2022-04-02 20:46:30 185

原创 弱指针my_weak_ptr

弱指针my_weak_ptr 弱指针里面只有RefCnt指针,指向一块空间,里面有指向对象的指针,和user记录有几个指针指向这个对象,weak记录有几个指针指向这个RefCnt这块空间 #include<iostream> #include<atomic> using namespace std; template<class _Ty> class MyDeletor { public: //MyDeletor() = default; MyDeletor()

2022-04-02 20:43:49 162

原创 shared_ptr(共享智能指针)

shared_ptr(共享智能指针) 和独立智能指针区别,它的对象可以被多个指针指向 先是一个对象里面有ptr和删除器,ptr指向一个对象,对象面有计数器ref,和指向对象的指针。 #ifndef MY_SHARED_PTR_H #define MY_SHARED_PTR_H #include<atomic> template<class _Ty> class MyDeletor { public: //MyDeletor() = default; MyDeletor() {}

2022-04-02 19:26:40 175

原创 unique_ptr(唯一性智能指针)

unique_ptr(唯一性智能指针) 不允许拿一个对象初始化另一个对象 删除了拷贝构造,有移动构造。 template<class _Ty> class my_unique_ptr { private: _Ty* Ptr; my_unique_ptr(const my_unique_ptr&)=delete; my_unique_ptr& operator=(const my_unique_ptr&)=delet; public: typedef _Ty* po

2022-04-02 19:26:00 239

原创 智能指针auto_ptr

裸指针:直接定义的指针 当裸指针指向的对象被析构,这个指针就是空悬指针 无法判断是个指针是一个空悬指针 为什么需要智能指针? 用裸指针你不知道你指的是一组对象还是一个对象。 auto_ptr(c++17中移除) 智能指针不对带有const的对象,因为要修改 拷贝构造时候,不知道是都指向,可能会释放两次。 template<class _TY> class my_auto_ptr { private: bool _Owns; _TY* _Ptr; public: my_auto_ptr(_.

2022-04-02 19:25:09 81

原创 快排(递归的,非递归的)从左往右的,从中间开始的随机的开始方式,链表的快排

#include<iostream> #include<vector> #include<list> #include<stack> #include<queue> using namespace std; // 快排 , 归并 , 堆排 // // 0(nlngn); S(1); // // // // typedef int ElemType; typedef struct ListNode { ElemType data; str

2022-03-31 20:55:09 147

原创 poll

12_30 I/O复用poll 1.如果一个一个字符读取,有几个字符就读去几次,因为接收缓冲区内还有数据 2.如果直接结束客户端,select就会收到这个描述符上有读事件,recv就不会受到数据0,就会知道已经关闭,然后就关闭它。 int poll(struct pollfd* fds,nfds_t nfds,int timeout); struct pollfd { int fd;//文件描述符 short events;//注册的事件 short revents;//实际发生的事件,由内核填充

2022-03-23 18:47:47 74

原创 网络编程tcp协议

tcp特点:面向连接 可靠的 流式服务(数据排序) 三次握手建立连接 connect 四次挥手断开连接 close 应答重传 超时重传 去重 乱序重排 滑动窗口 流量控制 多进程实现多个客户端同时发送 服务器 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <assert.h> #include &lt

2022-03-23 18:40:55 145

原创 I/O复用select

12-27 I/O复用select int select(int nfds,fd_set*readfds,fd_set* writefds,fd_set*exceptfds,struct timeval*timeout); nfds是文件描述符的总数 ,写事件,读事件,异常事件,超时时间 有一个集合有1024个位,开始都是0,每一个位代表一个描述符,1代表这个描述符是有的 FD_ZERO(fd_set*fdset) ;//清除所有位 FD_SET(int fd,fd_set*fdset);//设置某

2022-03-23 18:36:05 111

原创 lambda表达式 mutable 仿函数

lambda表达式 很像仿函数 类似于函数里面的函数 里面的变量不能改变,都是加了const的,加了mutable的变量,后面即使加了const也是可以改变的 里面的变量是重新拷贝出来的和外面的变量不一样 全局变量不需要捕获 [] 不捕获变量 [=]全部捕获按照值捕获 [&]以引用的方式捕获,他的变量是可以改变的,因为以你引用的底层就是指针 [=,&a]a是引用捕获, uto x0=[]()->int {return g_max;} 函数中this指针可以捕获,但是不可以捕获th

2022-03-23 18:13:53 259

原创 线程与进程

线程与进程 当两个线程都要加同一个值,同时都加就相当于加了一次 因为是多核处理器,有两个处理器共同运行,可能少加几次,如果是一个处理器同一时刻只有一个运行,一个执行路径,不可能有某一时刻同时修改i 本来运行值应该是5000,但是可能少计几次小于5000 可以加一个信号量让一个进程执行完之后在执行下一个进程,不在乎哪一个进程先执行 #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<stri

2022-03-23 13:21:19 75

原创 进程的并发执行

线程:进程内部的一条执行路径 进程:一个正在运行的程序 单线程:只有一条执行路径 多线程:有多个执行路径 主函数的执行路径:主线程 函数:子线程 pthread_creat() pthread_exit() pthread_join()

2021-11-25 21:19:23 1544

原创 2021-10-28调试一个程序

调试一个程序 gcc -o a a.c -g gdb a 加一个断点 b 查看所有断点 info break r 执行程序 s 进入函数 p 打印 n 单步执行 跟踪子进程 在fork之前执行 set follow-fok-mode child

2021-10-28 21:12:53 80

原创 2021-10-25系统调用与库函数

系统调用与库函数 printf函数 最后调用的还是write write(1,"hello",5)//0(标准输入) 1(标准输出) 2(标准错误输出) 5个字符 write是一个系统调用,printf是调用库函数 系统调用先中端,现场保护,根据系统调用号由操作系统来执行,进入内核,现场恢复。(write,fork,open,) 系统调用都是一些用户无法完成的,需要进入内核。库函数都是我们能实现的。 硬件>内核>系统调用>库 一个新进程都要先fork后exec #include&lt

2021-10-25 16:03:12 247

原创 2021-10-24替换进程exec系列

替换进程exec系列 execl execlp 可以不用绝对路径 execle execv 参数用一个数组代替 execvp 调用库函数 execve系统(和上面的都是调用这个)加上环境变量 这几个都没有太大区别至少是参数不一样,最后一个参数必须是空 替换成功原来的程序就没有了,不需要往下执行,成功不返回,失败才返回。 fork是从当前位置往下复制,一般fork与exec是一起执行的,先创建一个进程,然后替换这个进程。 which ps 查看这个进程的位置 execlp("/usr/bin/ps

2021-10-24 17:36:49 112

原创 2021-10-24先打开文件再复制文件

先打开文件再复制文件 1.子进程可以使用父进程打开的文件 2.文件偏移量父子进程共享 PCB进程控制块(进程描述符)struct task_struct 里面有一个 文件表里面弄记录了这个进程打开的文件,每一个进程都会默认打开三个文件0标准输入(stdin) 1标准输出(stdout) 2标准错误输出(stderr) ,一般文件表1024个空间,在要打开一个文件则在3号位置打开打开文件的返回值就是3,再打开文件值就是4(文件描述符),每一次使用的都是下标最小。 文件描述符:0 1 2数字 open的

2021-10-24 17:16:37 116

原创 2021-10-22哈希

哈希是一种存储方法 顺序表:逻辑相邻,物理也相临 链表:上一个节点存储着下一个结点的地址 哈希:数据节点和数据节点之间虽然不存在关系,但数据与存储地址有关系 最经常构造方法:除留余数法 一致性哈希 作用:将添加或者删除服务器时,对数据的影响降到最低 如果一个服务器会了就会影响到下一个服务器,将所有的值都存在下一个服务器,导致下一个服务器崩溃,多米罗效应。 可以在每一个服务器之间加几个分身,数据遇到分身是直接存放到这个服务器上,如果一个服务器坏了,就会将负担分担到其他服务器上。 ...

2021-10-22 15:58:06 109

原创 操作文件的系统调用

操作文件的系统调用 open read write close linux 读文件 #include<stdio.h> #incldue<stdlib.h> #include<unistd.h> #include<fcntl.h> #include<assert.h> int fd=open("file.text",0,O_RDONLY); assert(fd!=-1); char buff[128]={0}; int n=read(fd,buf

2021-10-17 20:23:20 82

原创 僵死进程&&写时拷贝技术

僵死进程 僵死:子进程先结束,父进程没有调用wait获取子进程的退出码,那么子进程就变成僵死状态。 解决将死进程:父进程调用wait() (但是子进程没有结束,那么就会阻塞一段时间知道子进程结束。 写时拷贝技术 当复制一个进程是,如果页表里面的东西一样,并不会重新创建一个空间,但如果你修改了子进程东西,就要重新创建一个空间 ...

2021-10-17 19:53:53 77

原创 三个题

三个题 1.求打印了多少个A int main() { for(int i=0;i<2;i++) { fork(); printf("A\n"); } } 答案:打印了6个A 第一次循环,子进程打印了一次,有调用了一个子进程,子进程的子进程打印一次,子进程的第二次循环有打印一次,父进程有打印了一次。 第二次循环:父进程打印一次,子进程打印一次。 2.当printf去掉\n int main() { for(int i=0;i<2;i++) { fork(); printf("A"); } }

2021-10-17 17:56:41 362

原创 逻辑地址

逻辑地址 逻辑地址并不是物理地址,一般指针指向的都是逻辑地址。 地址指的是,在分配的一块地址空间里的相对地址,可以通过查询“页表”查到在内核中的地址乘上4,再加上相对地址,就是真正的物理地址。 ...

2021-10-16 16:41:45 391

原创 printf方法&&fork进程赋值

ldd 查询可执行文件用到了那些共享库 printf方法 1.必须在程序结束完成之后才会输出,(并不是卡了),如果加了sleep(3),就是在三秒后打印到屏幕上,并不是执行到printf时就打印 int main() { printf("hello\n");//如果加了\n就会直接输出 sleep(3); exit(0);// } 2.如果换成_exit(0);就不会输出 3.也可以在printf后面加一个刷新函数fflush(stdout); 也可以直接输出 fork复制进程 申请一个pid ,将一个

2021-10-16 16:35:45 223

原创 队列变栈,栈变队列

两个栈表示一个队列 创建两个栈, 进:往栈1里面进 出:如果栈2不空,则从栈2出,如果栈2空,则先将栈1全部数据转入栈2,然后再从栈2出; 两个队列表示一个栈 规则创建两个队列 入:向queue里面入 出:如果q2不为空,将q2里面的值全部导入到q1中(剩下一个),此时q2中剩下的值就是我想要的, 如果q2,中不为空,代表所有的之都在q1中,则将q1中的值全部导入q2里(仅剩一个),此时q1中剩下的就是我想要的。 ...

2021-10-14 14:42:15 149 1

原创 2021-08-17printf,scanf_s

结构体 定义结构体时:类型最好由大到小或由小到大 因为结构体之间要对齐,所以不能进行比较(memcmp),也可以用 干预对齐#prama pack(1/2/4/8/16)将所有对齐都变成1对齐 如果与里面的最大类型大小相冲突则选最小的 联合体 联合体与结构体有一些相似之处。但两者有本质的区别。在结构体中,每个成员都有各自的存储空间。而在联合体中间各个成员共享同一个存储空间,一个联合变量的长度等于各个成员中最长的长度。 联合变量的每一次赋值都会新值冲去旧值 联合体里的每一个变量都指向同一个地址 printf

2021-08-17 20:21:10 120

原创 2021-08-15结构体

结构体 定义结构体里面不是变量是属性 结构体是一种数据类型,是创建变量的模板,不占内存空间,结构体变量才包含了数据需要储存空间 结构体存储都是自上到下,地址由小端开始 结构体变量里面的值都存放在.data区里,只能读不能写 结构体里面不能套用自己,以为会出现无线套用,但是可以套用这个结构体的指针 结构体可以互相初始化,也可以赋值 结构体字节对齐:结构体的大小 1.结构体变量的首地址,必须是结构体变量中“必须是最大基本数据类型成员所占的字节数”的整数倍 2.结构体变量中的每个成员相对于结构体的首地址的偏移量,

2021-08-15 19:05:19 83

原创 2021-08-1 分治法和递归

分治法和递归 分治法:问题不变,规模变小 所有的循环都可以改写为递归 循环有无限循环,但递归没有无线递归,因为栈有空间大小(1M)会溢出

2021-08-14 12:33:00 91

空空如也

空空如也

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

TA关注的人

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