- 博客(59)
- 收藏
- 关注
原创 Boost搜索引擎
注意:这里我们引入了cppjieba库,安装包需要自己去gitee去搜索这里就不提供了这个cppjieba库我们只用了下面两个文件一个是dict,一个是cppjieba,这里我们用了软连接将其链接在了本目录下,专门用了threadpart目录来保存本项目使用的各种库。
2025-11-19 22:38:58
1303
26
原创 网络基础概念
• TCP/IP协议实质上是一种系统性的解决方案• TCP/IP协议采用分层架构的根本原因在于:它所要解决的问题本身就具有分层特性• 目前虽未接触协议的具体内容,但我们可以先尝试从基础概念入手理解协议的本质• 操作系统源代码通常采用C/C++语言编写问题:主机B能否正确识别数据并准确提取a=10,b=20,c=30的值?回答:可以。由于双方采用了相同的结构体类型structprotocol,即使用了相同的协议实现代码和自定义数据类型,这种一致性确保了数据的识别和解析。这正是通信协议约定的作用所在。
2025-11-10 02:15:00
1113
13
原创 Linux:线程同步与互斥
具体而言,如果在解锁之后、pthread_cond_wait调用之前,其他线程获取了互斥量并发送了信号(此时条件已满足),pthread_cond_wait将无法接收到该信号,从而导致线程持续阻塞。单独线程持续等待条件满足是无意义的,必须由其他线程修改共享变量来触发条件变化,并及时通知等待线程。例如,某线程访问队列时若发现队列为空,就必须等待,直到其他线程向队列中添加新元素。通常情况下,线程使用的数据都是局部变量,这些变量的地址空间位于线程栈内,属于单个线程独有,其他线程无法访问这些变量。
2025-11-08 21:01:35
995
16
原创 Linux:线程的概念与控制
• 线程(thread)是程序中的一条独立执行路径。更准确地说,线程是"进程内部的控制序列"• 每个进程至少包含一个执行线程• 线程运行在进程内部,确切地说是在进程的地址空间内运行• 在Linux系统中,CPU视角下的PCB(进程控制块)比传统进程更加轻量级• 通过进程虚拟地址空间可以查看进程的大部分资源,将这些资源合理分配给各个执行流,就形成了线程执行流。
2025-11-08 16:00:09
1251
9
原创 Linux:进程信号
信号集能够表示每个信号的"有效"或"无效"状态:在阻塞信号集中,"有效"表示该信号被阻塞,"无效"表示未被阻塞;当某个信号的处理函数被调⽤时,内核⾃动将当前信号加⼊进程的信号屏蔽字,当信号处理函数返回时自动恢复原来的信号屏蔽字,这样就保证了在处理某个信号时,如果这种信号再次产⽣,那么它会被阻塞到 当前处理结束为止。除零异常后,我们并没有清理内存,关闭进程打开的⽂件,切换进程等操作,所以CPU中还 保留上下⽂数据以及寄存器内容,除零异常会⼀直存在,就有了我们看到的⼀直发出异常信号的现象。
2025-10-27 00:46:46
862
18
原创 Linux:进程间通信(1)
实际创建的文件权限会受到umask(文件默认掩码)的影响,最终权限计算公式为:mode & (~umask)。• 命名管道(FIFO)和匿名管道(pipe)的主要区别仅在于创建和开启方式不同,完成这些操作后,两者的行为特性完全一致。• 仅适用于具有亲缘关系的进程间通信,通常由父进程创建管道后调用fork,实现父子进程间的数据传输。• 进程控制:支持主控进程对目标进程的全方位监管(如调试进程),包括拦截异常、监控状态变更等。本节先到此结束,如过对进程通信感兴趣的话,还有后续进程通信(2)可以去看看哦!
2025-10-23 23:14:47
1222
18
原创 Linux:进程间通信(2)
当 shmaddr 不为 NULL 且 shmflg 设置了 SHM_RND 标记时,连接地址会自动调整为 SHMLBA 的整数倍,计算公式为:shmaddr - (shmaddr % SHMLBA)。换句话说,进程之间可以直接交换数据,而无需通过执行系统调用进入内核态。若在进程A访问期间,进程B也申请访问该共享内存,由于此时sem已为0,进程B将被阻塞挂起。当进程A申请访问共享内存资源时,若信号量sem的值为1,表明资源可用。• 系统中某些资源⼀次只允许⼀个进程使⽤,称这样的资源为临界资源或互斥资源。
2025-10-23 23:14:23
736
13
原创 Linux:库制作与原理
成熟的代码库是经过验证、可复用的现成解决方案。在实际开发中,任何程序都依赖于大量基础库的支持,开发者无需从零开始编写所有代码,这正是代码库的重要价值所在。从根本上说,库是可直接执行的二进制代码文件,能够被操作系统加载到内存中运行。库主要分为两种类型:Linux平台:.aWindows平台:.libLinux平台:.soWindows平台:.dll。
2025-10-16 22:42:34
797
9
原创 MySQL事务管理
事务是由一组逻辑相关的DML语句组成的操作单元,这些语句要么全部执行成功,要么全部失败回滚,形成一个完整的操作整体。MySQL通过事务机制确保这一特性得以实现。此外,事务还保证了不同客户端在同一时间看到的数据状态可能各不相同。事务是指一组需要执行的数据库操作,主要用于处理数据量大且复杂度高的任务。举个例子:当你毕业后,学校教务系统需要从MySQL数据库中删除你的所有信息(虽然这种情况通常不会生)。
2025-10-11 21:43:33
737
28
原创 MySQL表的约束
建立外键的本质其实就是把相关性交给mysql去审核了,提前告诉mysql 表之间的约束关系,那么当用户插入不符合业务逻辑的数据的时候,mysql不允许你插入。这是我们会AUTO_INCREMENT=3的字样,此时我们就会明白下一个id插入的值为3(我们没有赋值的情况下),很好的验证了开头自增长的定义。在创建表的时候,在所有字段之后,使用primary key(主键字段列表)来创建主键,如果有多个字段 作为主键,可以使用复合主键。要注意的是,这只是最后显示的结果,在MySQL中实际存储的还是1。
2025-08-29 15:01:49
1144
13
原创 MySQL数据类型
出于效率考虑,实际存储的是数字而非选项本身,因为每个选项对应一个特定的数字:1, 2, 4, 8, 16, 32...最多支持64个选项。1.tinyint是占一个字节的,并且取值范围在-128~127,上图插入1为正常插入,插入128则会报错,因为是越界插入(不在取值范围内的数值插入)。2.在MySQL中,整型可以指定是有符号的和无符号的,默认是有符号的。有一个调查表votes,需要调查人的喜好, 比如(登山,游泳,篮球,武术)中去选择(可以多选), (男,女)[单选]发表一个朋友圈或者评论的时间等等。
2025-08-28 00:15:00
611
7
原创 MySQL表的操作
创建表的语法操作:说明:示例:上述comment作用对指定列添加注释信息。请注意:不同存储引擎创建的表会生成不同的文件。(上图为例)(1)使用 MyISAM 引擎的 users 表为例,在数据目录中会生成三个文件:(2)使用InnoDB存储引擎创建表时,系统会自动生成两个文件:users2.frm(存储表结构信息) users2.ibd(包含表数据和索引)(1)语法:示例:说明:(2)查看相关表创建内容语法和查看数据库一样:示例:带上/G选项会变得更加简洁:在实际开发过程中,经常需要调整数
2025-08-22 23:29:19
1396
7
原创 MySQL库的操作
(2)如果创建数据库时未指明数据库的编码格式或校验规则,则默认使用MySQL配置文件中对应的编码格式或校验规则。下图配置文件编码格式则为:utf8。
2025-08-22 11:02:31
698
4
原创 MySQL数据库基础
SQL Server微软开发的数据库产品,深受.NET程序员青睐,适合中大型项目开发。Oracle甲骨文公司推出的企业级数据库,擅长处理大型项目和复杂业务逻辑,但并发性能通常不如MySQL。MySQL全球最流行的开源数据库(现属甲骨文公司),具有出色的并发性能,广泛应用于电商、社交网络和论坛等领域。其优势在于简单SQL查询的高效处理,但对复杂业务支持较弱。PostgreSQL由加州大学伯克利分校开发的关系型数据库,完全开源免费(包括私用、商用和学术研究),允许自由修改和分发。SQLite。
2025-08-20 20:10:02
1712
14
原创 linux:进程详解(2)
在Linux系统中,fork函数是一个关键的系统调用,它通过复制当前进程来创建新的子进程。调用fork后,系统会生成两个独立运行的进程:原始进程被称为父进程,新建的进程则称为子进程。子进程返回0,父进程返回子进程ID,出错时返回-1。当进程调用fork函数时,控制权会转移到内核中的fork执行流程。当⼀个进程调⽤fork之后,就有两个⼆进制代码相同的进程。⽽且它们都运⾏到相同的地⽅。但每个进 程都将可以开始它们⾃⼰的旅程,看如下程序。
2025-07-13 11:43:18
1144
16
原创 linux:进程详解(1)
当多任务内核需要切换运行任务时,会先保存当前任务的运行状态(即CPU寄存器中的所有内容),将其存入该任务的堆栈中。• 进程信息存储在进程控制块(Process Control Block,简称PCB)这一数据结构中,它本质上是一个包含进程所有属性的集合。• 进程退出状态必须被保留,因为它需要向关注它的进程(父进程)汇报任务执行情况。• 并发:在单个CPU环境下,通过快速切换进程的方式,在特定时间段内让多个进程交替执行,实现并发效果。• 要理解正在运行的进程的概念,需要了解进程的不同状态。
2025-07-13 02:15:00
1175
10
原创 初知C++:C++11
• 对于像string/vector这样的深拷贝的类或者包含深拷贝的成员变量的类,移动构造和移动赋值才有意义,因为移动构造和移动赋值的第⼀个参数都是右值引用的类型,他的本质是要“窃取”引用的右值对象的资源,而不是像拷贝构造和拷贝赋值那样去拷贝资源,从提高效率。• 对于⼀个参数包,我们除了能计算他的参数个数,我们能做的唯⼀的事情就是扩展它,当扩展⼀个包时,我们还要提供用于每个扩展元素的模式,扩展⼀个包就是将它分解为构成的元素,对每个元素应用模式,获得扩展后的列表。我们通过在模式的右边放⼀个省略号(…
2025-03-07 17:03:52
5880
10
原创 初知C++:继承
继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许我们在保持原有类特性的基础上进行扩展,增加方法(成员函数)和属性(成员变量),这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的函数层次的复用,继承是类设计层次的复用。下面我们看到没有继承之前我们设计了两个类Student和Teacher,Student和Teacher都有姓名/地址/
2024-11-03 22:48:08
1243
23
原创 初知C++:二叉搜索树
场景1:小区无人值守车库,小区车库买了车位的业主车才能进小区,那么物业会把买了车位的业主的车牌号录⼊后台系统,车辆进入时扫描车牌在不在系统中,在则抬杆,不在则提示本小区车辆,无法进⼊。场景2:商场无人值守车库,入口进场时扫描车牌,记录车牌和入场时间,出口离场时,扫描车牌,查找入场时间,用当前时间-入场时间计算出停车时长,计算出停车费用,缴费后抬杆,车辆离场。场景3:统计⼀篇文章中单词出现的次数,读取⼀个单词,查找单词是否存在,不存在这个说明第⼀次出现,(单词,1),单词存在,则++单词对应的次数。
2024-10-31 11:12:19
1191
11
原创 初知C++:多态
多态是⼀个继承关系的下的类对象,去调用同⼀函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象优惠买票。
2024-10-31 11:12:05
1196
8
原创 初知C++:红黑树
c为红,p为红,g为⿊,u不存在或者u存在且为⿊,u不存在,则c⼀定是新增结点,u存在且为⿊,则c⼀定不是新增,c之前是⿊⾊的,是在c的⼦树中插⼊,符合情况1,变⾊将c从⿊⾊变成红⾊,更新上来的。如果p是g的左,c是p的右,那么先以p为旋转点进⾏左单旋,再以g为旋转点进⾏右单旋,再把c变⿊,g变红即可。c为红,p为红,g为黑,u不存在或者u存在且为黑,u不存在,则c⼀定是新增结点,u存在且为黑,则c⼀定不是新增,c之前是黑色的,是在c的⼦树中插入,符合情况1,变色将c从黑色变成红色,更新上来的。
2024-10-30 09:33:43
842
4
原创 初知C++:map和set的使用
• set的声明如下,T就是set底层关键字的类型• set默认要求T支持小于比较,如果不支持或者想按自己的需求走可以自行实现仿函数传给第⼆个模版参数• set底层存储数据的内存是从空间配置器申请的,如果需要可以自己实现内存池,传给第三个参数。• ⼀般情况下,我们都不需要传后两个模版参数。• set底层是用红黑树实现,增删查效率是O(logN),迭代器遍历是走的搜索树的中序,所以是有序的。map的声明如下,Key就是map底层关键字的类型,T是map底层value的类型,set默认要求Key支持。
2024-10-30 09:33:33
907
7
原创 初知C++:AVL树
• AVL树实现这⾥我们引⼊⼀个平衡因⼦(balancefactor)的概念,每个结点都有⼀个平衡因⼦,任何结点的平衡因⼦等于右⼦树的⾼度减去左⼦树的⾼度,也就是说任何结点的平衡因⼦等于0/1/-1,AVL树并不是必须要平衡因⼦,但是有了平衡因⼦可以更⽅便我们去进⾏观察和控制树是否平衡,就像⼀个⻛向标⼀样。•场景1:h>=1时,新增结点插⼊在e⼦树,e⼦树⾼度从h-1变为h并不断更新12->15->10平衡因⼦,引发旋转,其中12的平衡因⼦为-1,旋转后10和12平衡因⼦为0,15平衡因⼦为1。
2024-10-12 19:05:43
930
1
原创 初识c++:模板详解
如果在C++中,也能够存在这样一个模具,通过给这个模具中填充不同材料(类型),来获得不同材料的铸件(即生成具体类型的代码),那将会节省许多头发。比如:当用double类型使用函数模板时,编译器通过对实参类型的推演, 将T确定为double类型,然后产生一份专门处理double类型的代码,对于字符类型也是如此。通常情况下,使用模板可以实现一些与类型无关的代码,但对于一些特殊类型的可能会得到一些 错误的结果,需要特殊处理,比如:实现了一个专门用来进行小于比较的函数模板。此时,就需要对模板进行特化。
2024-08-04 22:06:49
1163
5
原创 初识c++:stack和queue详解
目录#stack和queue详解#1.容器适配器2.stack的介绍和使用2.1 stack的介绍2.2 stack的使用3.stack的模拟实现4.queue的介绍和使用4.1 queue的介绍4.2 queue的使用5.queue的模拟实现6.priority_queue的介绍和使用6.1 priority_queue的介绍6.2priority_queue的使用7.priority_queue的模拟实现1.容器适配器。
2024-08-02 07:27:47
854
1
原创 初阶数据结构.排序(2.2冒泡排序)
上图其中利用flag是为了判断是否有序,提交前结束循环,提高效率。(排的是升序,如果想要排降序,可以修改一下if判断中的数组元素比较符号)
2024-08-02 07:27:24
331
1
原创 初识c++:list详解
例如,要访问列表中的第六个元素,必须从已知位置(如开始或结束)迭代到该位置,这需要在这些之间的距离上花费线性时间。排序是通过与每个元素的关联在内部保持的,即指向它前面的元素的链接和指向它后面的元素的链接。(4)与其他基本标准序列容器(数组,向量和deque)相比,列表通常在容器内的任何位置插入,提取和移动元素时表现得更好,并且因此在密集使用这些的算法中也表现得更好,例如排序算法。构造一个容器,其中包含与范围 [first,last] 一样多的元素,每个元素都由该范围内的相应元素构造,顺序相同。
2024-07-31 10:08:15
981
原创 初阶数据结构:排序详解
任取待排序元素序列中 的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右 子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排 序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为 止,得到一个新的有序序列。
2024-07-31 10:08:07
1185
原创 从入门到大佬:二叉树(3)
目录#二叉树链式结构的实现1.前置说明2.二叉树的遍历2.1.前序,中序以及后续遍历2.2层序遍历1. 前置说明在学习二叉树的基本操作前,需先要创建一棵二叉树,然后才能学习其相关的基本操作。由于方便大家更容易理解,降低大家学习成本,此处手动快速创建一棵简单的二叉树。注意:上述代码并不是创建二叉树的方式,真正创建二叉树方式后序详解重点讲解。在再看二叉树基本操作前,再回顾下二叉树的概念,二叉树是:1. 空树2. 非空:根结点,根结点的左子树、根结点的右子树组成的。
2024-07-29 05:00:00
690
原创 初识c++:vector全方面讲解及其代码模拟实现
目录vector全方面讲解及其代码模拟实现1.学习vector方法2.vector的使用2.1 vector的定义2.2 vector iterator 的使用2.3 vector 空间增长问题2.4 vector 增删查改2.5 vector 迭代器失效问题(重点)3.vector 深度刨析4.vector的模拟实现1. 学习vector方法学习使用vector的方法和使用STL的境界是一样的,要能做到以下三点:(1)能用(2)明理(3)能扩展这样才可以对vector展现很好的理解。
2024-07-29 05:00:00
1034
1
原创 初识c++:string类(2)
如果一个类中涉及到资源的管理,其拷贝构造函数、赋值运算符重载以及析构函数必须要显式给 出。一般情况都是按照深拷贝方式提供。下面是代码的实现:!!
2024-07-24 19:59:12
776
3
原创 从入门到大佬:二叉树(2)
(3)堆的插入,先利用元素个数和空间大小相不相等来判断空间是否足够,不足则进行空间的扩容,再把元素插入到堆的最后一个元素的后面,再进行向上调整算法来调整该元素所在堆应在的位置。下面我们给出一个数组,这个数组逻辑上可以看做一颗完全二叉树,但是还不是一个堆,现在我们通过算 法,把它构建成一个堆。删除堆是删除堆顶的数据,将堆顶的数据根最后一个数据一换,然后删除数组最后一个数据,再进行向下调 整算法。(5)堆的删除,将第一个位置和最后一个位置的元素交换,size--,即可。再将第一个元素向下调整,建堆。
2024-07-20 17:42:02
869
5
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅