自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 TCP与UDP的理解

udp协议报头数据表格TCP报头表格序列号: TCP对其数据帧中每一个字节的数据都做了一个编号,发送方用这些序号标记哪些数据发送出去。确认序号: 接收方响应给发送方时,用确认序号告诉发送方,接收方寂静收到了确认序号之前的那些数据,这个确认序号就告诉发送方,下一个数据应该从哪个序号开始发送。ACK: 确认序号标志位,当ACK=1时,确认序号有效,当ACK=0时,确认序号无效。值得注意的是,确认应答要保证前面的数据发过去了,也就是收到了ACK,才会继续发下一次的数据。问,为什么不只用一个序号就够了吗?

2024-07-17 02:38:45 1409 1

原创 x64-linux下在vscode使用vcpkg

5.在使用该库过程中,可能还是需要安装各种依赖,比如boost安装时,要openssl。openssl有需要autoconf等一些列工具,autoconf有可能找不到配置文件需要autoconf-archive。3.在你自己的项目目录下新建一个vcpkg.json,最简单的格式如下,如果你有更加细致的版本控制需求,可自行去官网查询。1.使用vscode远程连接上对应的linux ,或者直接在图形化界面上使用。4.编写cmakelist,这个里面可能需要你指定编译器。

2024-06-13 12:39:38 495 1

原创 TCP/UDP 套接字的编写

否则,将返回 值 SOCKET_ERROR ,并且可以通过调用 WSAGetLastError 来检索特定的错误代码。否则,它将返回SOCKET_ERROR,并且可以通过调用 WSAGetLastError 来检索特定的错误代码。连接实际上是使用 accept 返回的套接字建立的。果未发生错误, 则 accept 将返回 类型为 SOCKET 的值,该值是新套接字的描述符。否则,将返回 值 INVALID_SOCKET ,并且可以通过调用 WSAGetLastError 来检索特定的错误代码。

2024-05-24 18:18:54 423

原创 网络的基础理解

众所周知,计算机有许多硬件,以及底层的操作系统都有好多(对应的厂商也有很多),如果说彼此之间通信协议都不同意,如同打电话交流一样,你说英语,我说汉语该如何理解彼此的意思呢?协议实际时是由多层协议,一层一层的封装的。就好之你打电话,你们都说汉语是一种协议,底层无线电传输振动与电磁波相互转换也涉及协议。如图:每层数据传输时,都会添加对应的报头(header),那些形状就是表示对应的报头。**下图的数据传输也并非就是所有的网络通信都是如下图,实际还有中间路由转发等。:其中四层就是不考虑物理层。

2024-05-23 22:05:57 1145

原创 POXIS共享内存及信号量使用

相反,它们会创建一个映射区域的私有副本,即所谓的写时复制(copy-on-write)行为。这意味着初始时,映射区域和原始文件的内容是共享的,但一旦对映射区域进行写操作,系统会在需要时复制相应的页面,以确保私有映射区域中的修改不会影响原始文件或其他进程对同一文件的映射。对映射区域的写操作会反映到原始文件中,即写操作会更新文件的内容。持久性:通过 sem_open 创建的信号量默认是持久的,这意味着即使创建它们的进程已经终止,信号量仍然存在。不多介绍,之间你创建打开文件,是打开了文件描述符的。

2024-04-17 22:57:08 639

原创 Linux下C++获取文件流的文件描述符fd

因为用C++的对象读写其实有许多便利,所以我们只需要打开一个文件,更换底层的文件描述符,这样就可以使用C++的IO来做操作了。//注意,因为用的是ofstream,其缓冲区规则是全缓冲,如果你想要行式,那么就flush。(比如网络套接字socket,其使用就是文件描述符的使用)//当然,C++的std::endl具备刷新的效果。实例,下面通过重定向到标准输出,来将输入打印到屏幕。解释:因为在linux用C++时,

2024-04-16 16:25:46 503

原创 C++:new与delete

区别于C语言的是,

2024-04-12 11:00:37 358

原创 Linux线程

pthread_cond_t #这是一个类型,常用于定义一个条件变量,cond是condition之意# 这是一个宏,用于赋值给pthread_cond_t类型变量以初始化的pthread_cond_wait(pthread_cond_t*,pthread_mutex_t*) # 让指定含有条件变量的无法申请锁的线程进入等待pthread_cond_signal(pthread_cond_t*) # 让用指定条件变量的线程唤醒,且只唤醒一个。

2024-03-29 16:08:58 777

原创 VSCode使用MSVC编译器

3.分别生成对应的默认模板即可。但是其中参数可能需要配置。2.安装好C/C++插件。

2024-03-21 02:43:29 599

原创 Linux信号

内核态毫无疑问是可以调用用户的的方法的,但是这样的话,用户态就可以借此做一些越界不属于用户权力的事,不够安全),所以这个时候执行完用户任务的时候,回到之前的系统调用。3.异常产生信号:比如除0错误,进程在运算时,引发了硬件错误,进而使得操作系统来处理,发送信号给进程,来杀掉这个进程,以恢复硬件的状态。通过位图,位图的下标,来表示信号的编号,内容的01,来表示是否收到信号。SIG_BLOCK :添加set里面的信号成阻塞(就是说,如果信号集里面,1的就设置成阻塞,0的话不做调整)n信号在位图内就是n。

2024-03-10 15:47:33 896

原创 Linux管道

pipefd[2]:返回一个管道文件描述符数组,pipefd[0]是读端,pipefd[1]是写端。要进行读,就要关闭写端/要进行写,就要关闭读端。管道:**管道本质是内核中的一块缓冲区,多个进程通过访问同一块缓冲区实现通信。通过向管道里面读写,完成进程之间的通信。下面是利用匿名管道实现的一种进程池:其中展现了匿名管道代码编写种可能出现的bug。mode:指打开文件的权限,一般来说要减去umask。pathname:打开管道文件的地址。返回值:成功返回0,失败返回-1。返回值:0成功,-1失败。

2024-03-05 17:35:30 384

原创 linux的通信方案(SYSTEM V)

基于SYSTEM V的还有对应的信号队列(Message Queue),信号量。基本的系统调用函数,在下面代码中有,具体使用可以通过man手册查询。做法:去申请一块空间,让其映射到对应的不同进程的进程地址空间。linux内核看SYSTEM V设计的共享内存等通信方式。下面展示下Message Queue的简单使用代码。shmctl # 操控这块共享内存。shmat # 挂接共享内存。shmget #创建共享内存。#查看当前有哪些共享内存。#删除对应的共享内存id。那么具体是怎么做的呢?

2024-03-03 02:39:58 905

原创 Linux文件系统笔记

优点:动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。:程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文。-I 新增头文件搜索路径:表示找头文件是,也要去所给目录下找,-L新增库文件搜索路径:找库时,要去所给目录下找。件的整个机器码在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接。也需要打包,表明对应的库和头文件。

2024-02-19 20:13:30 991

原创 C++特殊类设计

【代码】C++特殊类设计。

2024-02-17 11:04:10 356

原创 Windows11右键新建.md文件

也就是说,这种文件默认对应的就是用VScode打开,新建的时候需要有Shellnew项里面存在NewFile。我猜,OpenWithProgids就是用什么程序(Program)打开的意思,后面是ID的意思。参考了网上很多修改注册表的方式,又去微软社区搜了OpenWithProgids的意思。我参考修改注册表的形式,修改对应的.md后缀成功了。因此分享出来,仅供参考。windows11右键如何新建.md文件,这个参考了网上说是修改注册表。但是有基本都不是Vscode的md的,于是对我都无效。

2023-12-20 18:10:40 787

原创 异常与智能指针(Exception & Smart_Ptr)

目前没有方便的解决办法,C++里面提供的方案就是对意识到是循环引用的情况,就使用另外一种指针。:这种指针就是用一个计数的办法,存储有多少个指向对应空间的指针,用这个来解决不能赋值的问题。我们知道,C++支持重载运算符,所以只要重载*和->就可以解决像指针的使用。运行下面的代码,打断点调试下,对除0函数里面的注释定义的取消,看看效果。有这个指针,基本解决了90%的场景,但是呢有一个特殊的场景没法解决。,这样就不会有指针悬空的情况,但是对某些情况就无法处理。而智能指针,就是基于这个特点去设计的。

2023-12-18 22:49:00 868

原创 C++11

使用初始化列表时,可添加等号(=),也可不添加。来看几个例子。

2023-12-09 21:08:50 49

原创 linux重定向

第一个参数是打开文件二点路径,第二个参数是打开方式,如英文的含义,第三个参数是如果在有创建文件的时候才给,如果没有创建,mode参数就会被忽略,其就是传输创建文件的权限,一般传输八进制数字。还有种不是很常规的写法,把标准输出重定向为log.txt,这个时候1就是指向的log.txt,但是1又被重定向指向了2,所以这个时候会直接通过标准错误打印信息到屏幕上,而log.txt里面什么也不会有。执行这个命令就能得到对应的两个文件,你会发现标准输出和标准错误分别就定义到了两个文件了。如下代码是可以验证上述的。

2023-12-08 00:05:12 1016

原创 Hash表,位图,布隆过滤器的实现

hash表就是一种存储数据的方法,

2023-12-01 17:29:07 44

原创 Linux的进程程序替换

简单介绍下execl,path给出替换的程序的路径,并且给出对应指令的字符串数组作为对应需要的指令,后面可以任意的字符串,如上面注释那样,在转换成对应的程序里面传的,arg是可变参数个数的字符指针,也就是让你传字符串,注意,这里需要让以NULL结尾才行。比如用A进程去替换B进程,那么之后运行的就是B进程,B进程就不会再运行了,这就是进程程序替换。剩下的就是执行命令,去获取输入的命令,查看是否需要重定向,然后就是区分内建命令和常用命令。上面使用的execl,linux下C语言里面还有好几个进程替换的函数。

2023-12-01 16:35:04 27

原创 AVLTree的插入实现

AVLTree本质是对,二叉搜索树的一种优化,二叉搜索树会因为插入数据顺序的问题,使得整棵树的效率变得底下,最后变成N的查找,丢失其优势特性。AVLTree于是引入一种平衡因子(balance factor,之后简称BF),让表示右子树减去左子树高度,只要这个BF绝对值不大于1,我们认为这棵树近似平衡,是一颗平衡二叉树。而这种平衡的搜索二叉树就能保证效率。

2023-11-22 15:22:08 27

原创 进程退出,等待

两者都有**status:**下面会详细介绍,其真正的作用(通过整形指针给整形赋值)是得到返回信息,所以如果你传空指针,意味着就不在意子进程的返回情况。观察可得,这种等待期间,是可以去父进程可以执行其他时间,只需要每隔一段时间来等待子进程就可以,而不是直接挂起等着子进程,同时子进程也可以执行一些任务。可以通过给pid传参数,选择等待任意一个进程,如果传值给-1,其就表示可以等待任意一个进程,option再传0的话,和wait效果就一样了。上面注释部分如果取消,下面就可以是答案,我们通过这点可以发现,

2023-11-13 23:43:58 38

原创 map和set的使用,二叉搜索树,红黑树的实现

这是为了后序表达更简洁。

2023-11-13 23:31:52 39

原创 实现迭代器封装过程遇见的问题总结

经过半天的调试和分析:发现原来是因为,const T实际上对Node那里实例化了另外的节点了,也就是Node*的节点,导致类型不同,从而刀子没有合适的函数去调用,也就是没有针对。看看下面的代码,依旧会报错,和上述原因类似,不妨分析下。,不知道Tree这个iterator是究竟是什么。Node*的iterator了,这点是值得注意的。

2023-11-12 12:35:00 24

原创 win11画图截取或者橡皮擦除后出现马赛克的非彻底解决(最新版画图已修复)

windows11在11月左右,再次打开画图软件,发现出现了个问题,截取或者擦除之后,原来的地方变成了马赛克,去查了百度之后,发现好像是Win11这个版本画图的特性。目前没有很好的一劳永逸的办法(重新安装Windows11自己就给你更新成最新版,有大佬可以教下如何阻止更新也可以指教下。依次点击,确保你选择的图层是新建的那一个(一般来说默认就是新建的那一个,不需要再点击了)在此做个记录,如果有更好的办法,求大佬评论区分享下。可以说很有Windows一向的作风,越更新越垃圾。这样使用就和之前一样了。

2023-11-08 23:34:10 10158 12

原创 C++的多态(polymorphism)

基本定义:在C++中,多态(polymorphism)是一种面向对象编程(OOP)的特性,允许不同的类(通常是基类和派生类)使用相同的接口进行交互,但表现出不同的行为。

2023-10-24 23:39:46 148

原创 C++的继承(inherit)

一样的具备构造函数的特性,会有初始化列表,也会在初始化列表最前端去调用一次父类构造函数,,假如我要实现和父类相类似,但是有要用很多父类的,那么继承就方便。C++的继承里面,有一种继承方式是虚继承,为了解决菱形继承的缘故。VS的实现中,是把属于父类的那一部分成员,给放到了整个类的最底层。如上相当于B这个类就是私有继承,那么其继承的三个成员都是是有的。父类的静态成员是private,子类依然是没有资格访问的。子类的析构函数,只需要完成对子类那一部分的处理即可,子类与父类是共用一套静态成员,继承不算很好的描述,

2023-10-23 17:58:05 112

原创 C++实现栈,队列,优先级队列

【代码】C++实现栈,队列,优先级队列。

2023-10-16 09:57:45 35

原创 模版template

不妨调用test2函数就去查看Data这个类,就发现已经把a这个对象里面的成员实例化成。跑上面段代码发现只第一段(被注释的那里是会编译器报错的,原因是编译器不知道你要实例化成什么样子)直接指定类型就可以了。

2023-10-13 00:01:19 35

原创 cin.tie(NULL);ios_base::sync_with_stdio(false);的解释

先解释这个,这个意思是和C语言的标准输出输入进行绑定。C语言的程序一般来说在程序第一次输入设备时,对应IO就已经准备就绪了,但是C++似乎并非如此(对于这点确是没找到对应资料,有清楚的请告知):C++的的IO就不与C语言绑定,最明显的就是你输出换行符不会再默认直接刷新出cout的内容。逐步运行这段代码,你会发现cin都输入完了,依然不会打印出10;本文主要参考自一个英文网站,和自己的实践经验。使用下面个语句才行。

2023-10-12 22:57:59 252

原创 gdb调试(快速上手)

通过info 查询断点编号,删除即可(gdb每次启动之后断点编号被删除了,编号一直增长,即使删除了不会调整)这种代码编译出的的就是release版本,是无法用gdb调试的,所以想要进入调试,就得用下面的命令。就会从第一行开始显示,往后你只需要敲回车就会一直显示后面的代码,因为gdb会记录最近执行的命令。图中3这个断点对应的Enb下就已经是no,说明断点被禁用,调试时也就不会在这里被击中而停下程序。输入指令就可以看见代码,但是这个是gdb自己选择的行号开始显示,如果你想指定行号。打断点和查看断点如下示例。

2023-10-08 17:22:30 39

原创 整形提升和算术转换

1.什么叫整形提升,就得搞清楚什么是整形。这里不过多介绍。这里知识会涵盖,下列介绍时也会用到,希望大家先去搜搜其他得博客或者书籍了解一下。。上述类型都可以在前面加unsigned变成无符号数(二进制里面得第一位不作为符号位,作为计数位)。打印结果就是“b”字符,所以char算是整形,下一个打印又是98。

2023-08-27 11:12:16 36

原创 模拟实现string,vector,list(双向链表)问题反思

简述:模拟实现中,复现了文档里面的运算符重载,完成了iterator(迭代器)的实现,完成了字符(以及字符串)查找和插入,实现基本的拷贝构造,赋值重载。对自己实现过程中遇见的问题做出几个标记。名字都保证和C++标准网站的命名一致,实现相同或者相类似的功能。:这个函数的任务是扩容,参考g++编译器下面的实现,我也用了二倍扩容的方法,这里需要注意多留下一个空间方便放’\0’;:这个基本上值得注意的不多,就是实现两个,方便外面传const型的string时,里面因权限延展的报错。

2023-08-18 17:26:46 42 1

原创 类的explicit,static,友元,匿名对象

这就涉及某种场景了,既要显式的写出类的变量,但是又想直接调用内部成员,那么这个时候友元函数就会显得很方便了。类似下面的定义方法就是匿名对象的定义,其生命周期一般只在当前一行,但是如果有const修饰会延长和const的变量一起。PS:隐式类型转换在传参有着很方便的优势,比如给某些地方初始化的时候,因此在后面c++11,引出了多参数传参。内部类概念:如果一个类定义在另一个类的内部,这个内部类就叫做内部类,具有和友元类的性质。:友元函数可访问类的私有和保护成员,但不是类的成员函数。

2023-08-04 22:50:22 68 1

原创 C++:类的成员函数

c++的类会具有构造函数。。如果你没写构造函数,编译器会生成一个。(里面实际上一般没什么内容)特点:** 无返回值,可以重载,**会在对象实例化(动态内存开辟后)由编译器调用一次。

2023-07-25 16:43:24 89

原创 C++的namespace,defalut funtion,reference,inline

如这里,就是对std标准命名空间的展开,使得我们可以使用标准命名空间里的函数,这种展开方式称之为全展开,在整个文件里面,都不应该再出现重名,否则就会出现错误。所以不要去分开声明和定义(也就是源文件定义,头文件声明的操作,因为不生成函数地址,也不是说去调用的问题)指c++里面可以给出因参数类型不同,参数个数不同,参数顺序不同之间的同名函数构成函数重载。// //其实,引用在底层就是用指针的方式来实现的,也就能理解上述的原因了。函数在使用引用传参的时候,使用引用传递参数,就可以改变原参数,

2023-07-23 17:25:41 53

原创 数组排序(C语言)

以下就是常见基本的排序方式1、冒泡排序2、选择排序3、插入排序4、希尔排序5、归并排序6、快速排序7、堆排序8、计数排序该处的排序原理,讲的其实十分细致。这里着重介绍下,快速排序和归并排序。

2023-07-22 17:52:50 1201 1

原创 二叉树的几个经典问题

如果是上图的二叉树。前序遍历是:1->2->4->7->8->5->3->6->9->10->11->12(这里指访问之后打印的话)中序遍历是:7->4->8->2->5->1->3->9->6->11->10->12后序遍历是:7->8->4->5->2->9->11->12->10->6->3->1经过上述叙述,其实所谓前中后指的就是根节点访问顺序的前中后。那么具体实现代码如下。

2023-06-24 11:07:36 62

原创 堆和堆排序

树(Tree)定义:树是一种抽象的数据结构,连接了多个节点。每一个节点都连接有多个子节点,同时连接有父节点,除了根节点。特性:没有环,一般用递归实现。如下图:就是树的例子。(图片来自维基百科)举例:红圈2就是父节点,也是根节点,7和5是父节点也是子节点。祖先:通过子->父节点关系可以找到的节点,就是祖先节点。后代:通过父->子节点关系可以找到的节点,就是后代节点。举例:5是红圈2的后代,2是5的祖先。度:对单个节点的子节点数,称之为度。如7这个节点度3,整颗树的度取所有节点度的

2023-06-22 16:25:59 36 1

原创 栈, 队列

这里实现的时候依然可以用单链表,但是在申请整个结构时,存一个头节点,也存下一个尾节点,这样加数组就不用走O(n)的时间复杂度。而只花了一个整形变量的空间。实现数据的先进后出,一般有这种特点的的数据结构就称之为栈,考虑仅仅改动尾部的数据,顺序表去实现栈,是最好的选择。有兴趣可以做做力扣上面有关栈实现队列,队列实现栈,以及循环队列的相关题目,进一步提升堆栈和队列的理解。实现先进先出的数据结构,一般用链表来实现。

2023-06-15 11:37:19 36

模拟实现string,vector,list(双向链表)问题反思

模拟实现string,vector,list(双向链表)问题反思

2023-08-18

空空如也

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

TA关注的人

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