- 博客(41)
- 收藏
- 关注
原创 【Linux】UDP与TCP协议
TCP是面向连接的协议,这是因为在一个应用进程可以开始向另一个应用进程发送数据之前,这两个进程必须先相互“握手”,即它们必须相互发送某些预备报文段,以建立确保数据传输的参数。例如,如果一个数据包的序列号是100,且包含100字节的数据,那么下一个数据包的序列号将从200开始。这样,即使数据包在传输过程中到达顺序被打乱,接收端也能根据序列号重新组装数据,确保数据的顺序性和完整性。作用:为了解决发送方和接收方发送和接收能力不匹配而导致的数据丢失问题,当发送方发送的太快,接收方来不及接受就会导致数据丢失;
2025-06-17 22:42:11
737
原创 【Project】高并发内存池
内存池是指程序预先从系统处申请一份足够大的内存,当程序需要内存时不去找系统申请而是找内存池申请内存。像这样向系统申请过量资源然后自己管理的方式被称为池化技术。因为申请资源都有较大的开销,而池化技术能大大减少这些开销。我们常用的malloc也是一个内存池。
2025-04-08 17:19:19
656
原创 【C++】C++11新特性
每个catch块可以处理不同类型的异常,也可以使用省略号(...)来捕获任意类型的异常。异常可以是任意的类型,通常是一个派生自std::exception的异常类对象。C++可变参数是指函数的参数个数是可变的,可以在函数定义时不确定参数的个数,需要在函数体内通过特定的语法来处理这些参数。捕获分为按值捕获和引用捕获两大类,引用捕获的变量可以修改,但按值捕获的不行。绑定类的成员函数时要注意,类的成员函数是要传入this指针的。如果是嵌套的函数抛出异常在自己那层异常没有被捕获,就会层层返回直到异常被捕获。
2025-03-12 21:43:50
758
原创 【C++】unordered_map和unordered_set的模拟实现
散列表是一种通过哈希函数将键映射到数组索引的数据结构,利用哈希函数将键值转化成索引,然后可以通过索引快速确定数据所在位置。首先我们先来见见哈希函数,哈希函数就是为了将键值转化成索引。这里对字符串类型进行特化处理,为的是降低字符串转化索引的重复率以减少冲突的现象。 使用时直接构建Hash对象,用对象调用operator()即可。哈希表哈希表有很多种实现方式,这里以开放地址法(直接定址法)为例。总结:数据经过哈希函数转换成索引,再用索引容量得到插入的下标,如果出现位置被占用(简称冲突)就向后依次
2024-11-01 00:07:37
952
原创 【Linux】信号的产生、保存与处理
信号是Linux提供的一种向指定进程发送特定事件的方式。Linux中规定了64种信号,其中1到31号为不可靠信号(可能丢失),32到64号为可靠信号(不可能丢失)。注:绝大多数的默认操作都是终止进程。信号通常经历以下三个阶段,产生、保存、递达(处理)。处于保存时期的信号处于一个叫未决的状态。可以简单理解为信号到了,但未处理的状态。举个例子,你的朋友让你给他买瓶汽水,但由于你手头上有更加重要的事,所以你默默地记下给他买瓶汽水这个信号等到你忙完后才去执行。
2024-09-08 16:41:31
1280
原创 【Linux】命名管道
管道本质上就是一个可读写的文件,一个进程向文件中写入数据,另一个进程从文件中读取数据,那么此时就实现了通信。因为这种数据的传输是单向的,所以才被称作管道。管道的实现就是两个不同的进程打开同一个文件。匿名管道匿名管道仅用于父子进程或有血缘关系的进程(即有一个共同的祖先进程)原理在通信开始前父进程先以读和写两种权限分别打开同一个文件,再利用fork()函数形成父子进程,因为子进程继承了父进程的数据,所以打开的文件描述符表中也有以读和写两种权限分别打开同一个文件的文件描述符。
2024-08-29 21:57:23
752
1
原创 【数据结构】set与map
在STL中实现了树形结构(红黑树)和哈希结构(哈希桶)两种管理式结构。其中树形结构主要有set、map、multiset、multimap四种。
2024-07-08 13:50:18
428
原创 【数据结构】平衡二叉搜索树/AVL树
左右子树高度差的绝对值不超过1。(即左右子树高度差取值为-1,0,1)且左右子树均为VAL树右子树的值大于左子树的值当有序(升序或降序)地插入时,搜索二叉树就会出现下图的情况,搜索次数从树的高度次退化成n次。而平衡搜索二叉树就解决了这一问题。
2024-06-29 23:13:01
954
原创 【数据结构】搜索二叉树的概念及实现
搜索二叉树规则(左小右大):如图:在搜索时,若大于根,则去右子树寻找;若小于根,则去左子树寻找。直到找到或为空结束。在理想状态下只需查找树的高度次。
2024-06-13 11:27:18
971
原创 【C++】常见的多态面试题
注意:重写是指重写函数体。如下图,有这么一道题:b通过虚函数表调用了继承的test(),test()又通过虚函数表找到自己的(重写的)func()结果打印出来的结果却是B:1,其使用的缺省值是A类中的func()的缺省值,所以实际上b调用func函数时使用的是自己的函数体,声明却是使用原声明。return 0;
2024-06-04 12:04:03
366
原创 【C++】优先队列priority_queue的特性与使用
优先队列是队列的一种。从模板参数上去看优先队列比队列多了一个模板类less,这个less主要是为了实现伪函数,而这个仿函数则是规定优先级高低的规则。优先规则也可以根据需要进行自定义。在接口的使用上完全一致,只是优先队列有出队列的优先级限制。
2024-05-13 12:32:34
471
原创 【C++】list的特性及使用
STL中的list是指,list每个元素的存储相互独立,因为其节点存储位置独立不连续,其插入和删除不需要挪动其他元素效率比起vector更高。但也因为存储空间不连续的问题,不能做到和vector一样的随机访问。
2024-05-06 11:29:26
405
原创 【C++】string类的模拟实现
用传入参数的 _str 作为参数运行构造函数,让 tmp 帮我们开空间、拷贝数据,然后再让tmp和this交换,如此便实现了this的构造,同时在退出拷贝构造时,tmp会自己调用析构函数。:_str 多开了一个空间是用来存放 \0 的,缺省参数处的 "" 表示空串。注意,只有 n 大于原来的容量时才扩容,并且扩容不影响大小 _size。写法与输入流基本无差异,循环的判断条件处去掉了不是空格的判断。将数据往后挪动,腾出一个位置插入新字符即可。传统写法就是老老实实自己开空间,拷贝数据。
2024-03-25 18:43:12
1014
原创 【Linux】gdb的使用
平时使用的编译器自带调试功能,而在Linux下我们使用gdb来进行调试。GDB 全称“GNU symbolic debugger是Linux常用的程序调试器。调试的前提是这个程序含有调试信息,否则是无法调试的。gcc -o test test.c 这样生成的可执行程序不带调试信息,无法调试。gcc -o test-debug test.c -g 想要生成的可执行程序可以调试只需要加上 -g 选项即刻。
2024-03-12 13:44:42
379
原创 【C++】模板类
template 类声明在编译阶段,编译器会根据类型形式参数列表确定产生怎么样的类。简单地说就是在编译阶段编译器根据模板类生成了很多类型不同的类,大大减少了重复的代码量。public:~SeqList()cout
2024-03-05 11:17:20
374
原创 【C++】内存分配管理
与new不同的是,new[] 申请内存时会多分配 sizeof(size_t) 的内存大小来记录数组的元素个数,这样 delete[] 才能准确知道调用多少次析构函数。注:new/delete与malloc/free在内置类型上区别不大,主要在用法上略有不同。同理,new[] 就是先执行 operator new[] 再执行n次构造。先析构再回收内存是为了防止对象的成员有申请的内存没有回收造成内存泄漏。如果用 delete 来释放 new[] 申请的内存会出错。
2024-03-02 21:19:37
381
原创 【C++】初识C++
对于内联函数来说,主要是省去了建立栈帧和销毁栈帧的消耗,等于在调用函数的地方运行等价的表达式。由于函数重载和内联函数的存在,宏在C++的意义也不大了。
2024-02-25 21:29:36
1084
1
原创 【C语言】排序
计数排序,创建一个数组count,将数据作为下标来访问数组count,然后通过数组count记录个数,然后遍历数组count,只要数组count的值不为0,就将下标一个一个赋值给原数组。为了不浪费空间,开数组count前找到数据中的最大最小值,开辟的数组count大小为max-min+1。记录数据时这样一来,最小值的个数就存储在下标为0的地方,最大值存储在max-min也就是最后一个位置。最后赋值时记得将下标加回最小值。
2024-01-27 21:29:35
915
原创 【数据结构】堆与堆排序
假设其深度为h,则除了第h层外,其余层的结点数均饱和,第h层的结点可以饱和可以不饱和(注:满二叉树是一种特别的完全二叉树),且结点总是从左到右连续。
2024-01-18 11:49:22
491
1
原创 【Linux】基本指令、重定向、命令行管道
cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中。若同时指定多个文件或目录,而最后的目的地并非一个已存在的目录,则会出现错误信息。若mv命令中第二个参数类型是目标文件或者是目标目录,mv命令将文件重命名或将其移至一个新的目录中。管道是可以级联多条命令的,每条命令的结果输出,都作为输入,导入下一条命令。概念:将本该输出到屏幕上的内存,重新定向到某个指定的文件中。例:mkdir -p a/b/c/d/e。
2023-12-05 17:54:11
1200
原创 【数据结构】栈与队列
队列是一种一端进行插入,另一端进行删除的线性表。队头是进行删除操作的一端。队尾是进行插入操作的一端。所以队列是先进先出的线性表。
2023-11-25 18:36:42
3046
原创 【数据结构】链表
当你释放掉最后一个节点的空间时,你会发现原来的倒数第二个节点的next无法赋值为NULL。:内存分配更加灵活,不会出现空间浪费,需要一个节点创建一个节点,也可以只释放(free)一个节点的空间;查找就相对简单,只要从头到尾遍历一次,其中有与查找目标x相同的数据就返回其地址,循环结束都找不到就返回NULL。2.之后就简单了,释放最后一个节点的空间,并将cur->next赋值为NULL就完成尾删了。2.提前存储好下一个节点地址后,释放原头指针地址的空间,最后让头指针指向新的第一个节点。这样的操作是不合法的。
2023-11-17 13:03:03
68
原创 【C语言】程序环境与预处理
可能有人会好奇,为什么要添加如此多的括号。接下来我一一举例。如图,我们预想的结果应该是36,即为3x(3x4),但因为#define是直接替换,所以导致其变成了3*2+1*1+3,按照优先级先算了乘法。所以要在x*y加上括号变成(x*y)。在以下代码中,即便改成(x*y)也还不行,替换时变成了3x(2+1*1+3),括号内部仍未变成我们想要的3x4,括号内的结果为6。所以正确的做法应该是改成((x)*(y)).另外,像x+,++x,x--,--x这类自加自减的参数万不可扔进宏里,天知道他会自加自减多少次。
2023-10-23 11:00:43
58
原创 【C语言】文件操作
今天为大家讲解的是文件操作,可能有人好奇写个代码又跟文件有什么关系。请大家回忆一下,以往写的代码,特别是需要存储一些数据程序。你会发现每次程序结束,你输入的数据都无法存储。而文件能够在程序结束后存储数据,下次再使用又可以读取数据,这便是文件操作的意义。
2023-10-21 21:08:07
859
1
原创 【C语言】字符串函数
strlen返回字符串的长度,但不包括\n,如果使用操作符sizeof则会算上\n所占的空间。注:sizeof算的是大小,不是长度,只是char类型大小恰好是一个字节。
2023-10-05 11:36:09
129
原创 【C语言】自定义类型
struct book //类型声明int price;}a;//定义全局变量astruct Stu //类型声明int age;//结构体嵌套初始化int main()//给变量a赋值//局部变量b的初始化(初始化:定义变量的同时赋值)return 0;enum Day//星期Mon=1, //默认为0,下面的成员都是前一个成员+1Tues, //一次性创建若干个常量Wed,Thur,Fri,Sat,Sunint main()int a;switch(a)
2023-10-02 12:29:46
100
1
原创 【C语言】函数
与库函数不同,自定义函数需要程序员自己来设计。return a+b;该自定义函数实现了计算两个数的和,Add是函数名,Add前面的int为返回类型,而括号中的为形参,在调用时要给予两个整形的参数。返回类型 函数名(形参)语句项;一般来说函数的声明通常放在头文件中(可以将自定义函数的声明放在自定义的头文件中)代码的读取是由上到下的,需先声明后使用。函数的声明至少要在函数调用之前。函数的定义是指函数的具体实现,交待函数的功能实现。
2023-09-05 10:41:35
62
1
原创 【C语言】数据在内存中的存储
而负数让原码反转(即0变成1,1变成0)得到反码,反码+1得到补码。当E为全0时,E=1-127或者E=1-1023即为真实值。字符型char在数据中存储的是ASCLL码值,又因为ASCLL码值为整形,所以char属于整形家族。a为整形,大小为四个字节,有32个比特位可以用来存储,第32位表示正负,0为正,1为负。浮点数在数据中的存储很特别,虽然float和int的大小一致,但其存取的方式不一样。当E为全1时,如果有效数字M全为0,表示+-无穷大。构造类型是自定义的类型。存储的,并且存储的是。
2023-08-08 11:39:19
71
1
原创 【C语言】指针
虽然该地址依旧存在,但随着跳出函数,临时变量也被销毁,该地址存储的内容又变回随机值。注:不知道给指针赋什么值时,可以赋值为NULL(定义上:NULL=0),即将指针赋值成空指针。
2023-08-03 11:37:58
114
原创 【C语言】循环语句
因为当i等于3时,执行了continue跳过剩下的循环语句,进入判断部分,所以没有打印3。当i等于8时,执行了break直接跳出了循环(跳过整个for循环)所以没有打印8和9。在用写程序的过程中,难免会遇到需要重复多次执行的语句,要是重复去写不仅高质量大,也不好维护,而循环语句很好地解决这一问题。(2)所以在循环语句中要包含使判断条件越来越接近假的语句,否则条件恒为真造成死循环。,之后再对条件进行判断,为真则继续循环,否则跳出循环。(加深部分形成闭环,直到判断部分为假跳出循环。,用于循环条件的调整。
2023-07-22 11:28:16
107
原创 【C语言】常量
使用#define预处理器可以在程序中定义一个常量,它在编译时会被替换为其对应的值。int main()//此处打印结果为100return 0;#define 定义常量是直接进行替换,而const 是通过修饰变量得到常变量。#define 是直接替换,所以没有数据类型编译器也无法对其进行类型检查,而const 可以,因为const 修饰的常量具有类型信息。#define 没有作用域限制,他在整个程序都有效,而cconst 有明确的作用域限制,只能在其定义的作用域使用。
2023-07-02 13:14:25
239
1
原创 【C语言】变量
char 字符型short 短整型int 整型long 长整型long long 更长的整型float 单精度浮点型double 双精度浮点型不同类型的变量在初始化时的写法可能不一样。char a = 'a' 赋值单个字符时要用单引号括起来。
2023-06-17 09:41:48
140
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人