自定义博客皮肤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 103

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

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

2022-05-23 14:32:06 106

原创 条件变量

条件变量P V二元信号量(不是零就是一)binary_semaphore semp=1;binary_semaphore sems=1;semp.acquire();1->0sems.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 105

原创 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 513

原创 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 156

原创 类型转换 完美转发 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 112

原创 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 43

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

矩阵连乘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 154

原创 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 98

原创 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 53

原创 动态规划题

动态规划题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 49

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

动态规划(最长公共子序列)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 844

原创 守护进程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 50

原创 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 0c/c++ 编译型:xx.c 编译生成二进制的可执行程序,直接运行可执行程序,因为可直接运行,所以运行效率高一些。

2022-04-03 20:19:30 92

原创 循环引用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 116

原创 弱指针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 100

原创 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 119

原创 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 139

原创 智能指针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 39

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

#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 96

原创 poll

12_30 I/O复用poll1.如果一个一个字符读取,有几个字符就读去几次,因为接收缓冲区内还有数据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 36

原创 网络编程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 97

原创 I/O复用select

12-27 I/O复用selectint 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 67

原创 lambda表达式 mutable 仿函数

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

2022-03-23 18:13:53 170

原创 线程与进程

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

2022-03-23 13:21:19 40

原创 进程的并发执行

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

2021-11-25 21:19:23 1408

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

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

2021-10-28 21:12:53 47

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

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

2021-10-25 16:03:12 189

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

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

2021-10-24 17:36:49 73

原创 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 64

原创 2021-10-22哈希

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

2021-10-22 15:58:06 63

原创 操作文件的系统调用

操作文件的系统调用open read write closelinux读文件#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 50

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

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

2021-10-17 19:53:53 43

原创 三个题

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

2021-10-17 17:56:41 268

原创 逻辑地址

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

2021-10-16 16:41:45 269

原创 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 157

原创 队列变栈,栈变队列

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

2021-10-14 14:42:15 98

原创 2021-08-17printf,scanf_s

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

2021-08-17 20:21:10 65

原创 2021-08-15结构体

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

2021-08-15 19:05:19 41

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

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

2021-08-14 12:33:00 45

空空如也

空空如也

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

TA关注的人

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