自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Boost搜索引擎项目

目录1.项目相关背景2.搜索引擎的相关宏观原理3.搜索引擎技术栈和项目环境4.正排索引 && 倒排索引--搜索引擎原理5.编写数据去标签与数据清洗的模块 -- parser.hpp去标签编写parser(将文件去标签)编写EnumFile函数编写ParseFile函数解析三大部分:编写SaveFile函数6.建立索引--编写index.hpp模块构建正排索引构建倒排索引jieba分词编写倒排索引7.编写搜索searcher8.编写http_server模块测试引入cpp-httplib库利用scl源升级gc

2022-10-06 14:59:02 1350

原创 【Linux操作系统】-- 多线程(三)-- 线程池+单例模式+读写者模型

线程池场景 代码实现线程安全的单例模式懒汉实现方式和懒汉实现方式饿汉方式实现单例模式懒汉方式实现单例模式实战代码演练单例模式读者写者模型解释基本操作创建/销毁读写锁读者锁和写者锁解锁伪代码理解读写锁优先级挂起等待锁vs自旋锁自旋锁语法

2022-09-02 17:04:13 521 3

原创 【Linux操作系统】--多线程(二)--条件变量

Linux线程同步条件变量条件变量的作用:条件变量的用法:条件变量简单案例:为什么pthread_cond_wait需要互斥量?生产者消费者模型为何要使用生产者消费者模型生产者消费者模型优点基于BlockingQueue的生产者消费者模型C++ queue模拟阻塞队列的生产消费模型复盘生产者消费者问题POSIX信号量1.回顾信号量的概念2.认识信号量对应的操作函数3.认识环形队列4.结合sem+环形队列编写生产消费模型...

2022-09-01 16:13:47 1282

原创 浅谈linux下的jsoncpp

其中jsoncpp包含三个模块: Value -- 序列化和反序列化转换的类 Reader--序列化 Writer-反序列化:fastWriter styledWriter

2022-08-17 18:12:58 445 1

原创 【Linux操作系统】--多线程(一)

笼统的讲线程是在进程内部运行的一个执行分支(执行流),属于进程的一部分,粒度要比进程更加细致和轻量化。在一个程序里的一个执行路线叫做线程,更准确的定义是线程是”一个进程内部的控制序列“一切进程至少都有一个执行线程线程在进程内部运行,本质是在进程地址空间内运行在Linux系统中,在CPU眼里,看到的PCB都要比传统的进程更加轻量化透过进程虚拟地址空间,可以看到进程大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流。...

2022-08-01 14:58:24 474

原创 C++高阶--并查集

并查集的原理【question1】并查集的实现并查集的基本结构代码实现合并两个数的集合两个数是否在一个集合集合的数量并查集的应用省份数量 等式方程的可满足性扩展:

2022-07-13 09:46:02 297

原创 哈希切割+布隆过滤器

目录布隆过滤器布隆过滤器的提出布隆过滤器的概念布隆过滤器的实现插入set函数布隆过滤器长度的设置测试布隆误判率布隆过滤器删除布隆过滤器的实现场景布隆过滤器的扩展以及哈希切分...

2022-06-30 16:17:52 319

原创 C++哈希的应用--位图+哈希的一些补充

位图位图的实现将x对应比特位0置1将x对应比特位1置0查看x位置是0还是1位图的应用哈希的补充

2022-06-20 20:46:38 382

原创 C++哈希

unordered系列关联式容器unordered_mapunordered_map的文档介绍unordered_set底层结构哈希概念哈希冲突的解决闭散列:代码实现哈希基本结构插入查找find删除仿函数的应用开散列基本结构插入的实现查找删除Unordered_set/Unordered_set对哈希的封装封装代码框架:哈希表的迭代器【operator*和operator->】operator++前置++ 迭代器

2022-06-09 20:01:51 3181

原创 C++红黑树的插入实现+红黑树迭代器实现+map/set封装红黑树

红黑树的基本编写红黑树的概念红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的红黑树的性质每个节点不是红色就是黑色 根节点是黑色的 没有连续的红色节点,但是可以有连续的黑色节点 每条路径黑色节点数量相等 每个叶子节点都是黑色的(此处的叶子节点值得是空节点--NIL节点,不是以前真正意义上理解的叶子节点)。假设每条路径

2022-06-01 18:27:02 486

原创 C++[编程题]分解因数

【思路】:这道题给出一个数a,需要分解因式。一个数的因式分解范围是从[2,sqrt(a)],从2开始到a的平方根范围,这些都是a的因子。首先我们需要判断a这个整数从2开始,是否可以整除范围中的数,如果整出了,说明范围中的数就是其中一个因子。因为整除因子从除1最小数开始遍历因字数,所以需要将a这个数缩小范围,当a为12的时候,12最开始整除2,如果a这个数能够整除2,那么将a的值缩小a/=2,变成6,使得6再从2开始整除,整出到最后剩下一个质数3,那么会跳出for循环的条件,存在质数的情况,我...

2022-05-24 01:37:45 1030

原创 C++中AVL树的插入实现

AVL树的概念二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单 支树,查找元素相当于在顺序表中搜索元素,效率低下。因此,两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年发明了一种解决上述问题的方法:当向二叉搜索树 中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度。一棵AVL树或者是空树,或者是具有以下性质的二叉搜索树:它的左右子树都是AVL

2022-05-23 18:35:23 299

原创 【Linux操作系统】--进程信号--信号产生前的产生方式

信号入门生活角度的信号生活中有很多信号的场景,比如红绿灯,闹钟,信号枪,鸡叫声等等...,这些信号都是给人看的,如果这些信号脱离了人类,红绿灯给牛看,信号枪给鸟打,鸡给鸡叫,这些都是没有意义的。当这些场景触发的时候,我们人类立马就知道要做什么。那么是不是这些场景真正放在我们面前,我们才知道做什么呢?其实和场景触发没有直接关联。对于信号的处理动作,我们早就知道了,甚至远远早于信号产生。那么我们是怎么做到没有信号就知道该怎么做呢?我们对特定事件的反应,是被教育的结果,本质是我们记住了。结论1:所以信

2022-05-12 18:08:40 464

原创 C++ -- map和set的需要注意的地方的使用讲解

目录关联式容器树形结构的关联式容器setset的删除erasemultisetmultiset的删除:erasemap【pair键值对】【map的插入insert】【遍历map】map的operator[] && 统计次数multimap关于map的一个练习小程序关联式容器在初阶阶段,我们已经接触过STL中的部分容器,比如:vector、list、dequeforward_list(C++11)等,这些容器统称为序列式...

2022-05-10 16:46:32 521

原创 C++二叉搜索树的递归和非递归实现

二叉搜索树概念二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值 它的左右子树也分别为二叉搜索树二叉搜索树的应用1. K模型:K模型即只有key作为关键码,结构中只需要存储Key即可,关键码即为需要搜索到的值。比如:给一个单词word,判断该单词是否拼写正确,具体方式如下:以单词集合中的每个单词作为key,构建一棵二叉搜索树 在二叉搜索树中

2022-05-09 11:40:33 642

原创 【Linux操作系统】--System V的共享内存进程通信

System V起源共享内存原理共享内存应用原理共享内存接口创建共享内存shmgetshmget测试 创建和删除代码挂载接口shmat 去关联调用接口shmdt 第二个进程与共享内存挂载两个进程进行通信共享内存的特性补充知识【shmget的第二个参数size】 shmid每次运行的数量会增加问题system V信号量(非重点)

2022-05-06 19:30:28 788

原创 【Linux操作系统】--进程间通信--匿名管道和命名管道

进程间通信介绍进程间通信目的进程间通信发展匿名管道什么是管道站在文件描述符角度-深度理解管道匿名管道建立信道开始操作-管道基本特性 总结:命名管道命名管道创建一个命名管道编写一个命名管道创建管道服务器端读取客户端client写入 写端业务逻辑拓展功能总结

2022-05-04 12:48:37 1522

原创 【Linux操作系统】--动态库和静态库的制作和使用

动静态库的制作静态库的制作makefile文件生成静态库最后库制作代码运用静态库【自己写一可执行程序】:用gcc命令编译用makefile文件编译动态库的制作形成.o文件使用动态库两种库的混合使用

2022-05-02 18:19:02 1031 3

原创 【Linux操作系统】--理解文件系统inode

磁盘的理解文件=文件内容+文件属性如果一个文件没有被打开,它的内容和属性在哪放着呢?它们是在磁盘上放着的。磁盘是我们计算机中的一个机械设备(现在很多都是SSD,FLASH卡,USB,但是现在不考虑这些例外)。其实固态硬盘写入有固定次数,比如一万次或两万此,再写就击穿了,最后就坏掉了。比如说有两个盘片,有四面,所以有四个磁头盘片在寻址:我们所有的数据都在盘片上放着,都是一些硬件电路,这些硬件电路都在盘片上放好,具体在什么位置,磁头来回摆动,他在摆动的时候是在圆心和半径摆动,而盘片在不断转动,通

2022-05-02 00:31:58 3368 2

原创 【Linux操作系统】-- 基础IO

我们写的程序最终都是要访问硬件:显示器,键盘,文件(磁盘)这些东西的。那么OS(操作系统就是硬件的管理者)。但是用户/语言,程序,lib不能直接访问硬件,也不能直接访问驱动,也不能直接访问OS。所以,所有的语言上的对“文件”的操作,都必须贯穿OS!我们知道OS对外界是不公开的,操作系统不相信任何人,如果要访问操作系统,需要通过系统调用接口!几乎所有的语言fopen,fclose,fread,fwrite,fgets,fputs,fgetc,fputc等底层一定需要使用OS提供的接口调用。所有的语言要

2022-04-29 15:47:56 356

原创 C++多态的一些问题

1. 什么是多态?2. 什么是重载、重写(覆盖)、重定义(隐藏)?3. 多态的实现原理?

2022-04-25 21:02:26 1020

原创 【C++】-- 多态

总结一下派生类的虚表生成: a.先将基类中的虚表内容拷贝一份到派生类虚表中 b.如果派生类重写了基类中某个虚函数,用派生类自己的虚函数覆盖虚表中基类的虚函数 c.派生类自己新增加的虚函数按其在派生类中的声明次序增加到派生类虚表的最后。但是不会在调试窗口显示出来,这也算编译器给优化的一部分。可以通过内存窗口查看。6. 这里还有一个童鞋们很容易混淆的问题:虚函数存在哪的?虚表存在哪的? 答:虚函数存在虚表,虚表存在对象中。注意上

2022-04-25 10:15:54 555

原创 【Linux操作系统】--攥写一个简易的shell工具

做一个简易的shell第一步:打印提示符,在同一行打印出提示符 第二步:获取标准输入,获取命令字符串第三步:将字符串分割,解析字符串 第四步:替换进程,执行第三方命令3.5、执行第三方命令:

2022-04-19 15:08:11 1306

原创 【Linux操作系统】--进程程序替换

用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。调用exec并不创建新进程,所以调用exec前后该进程的id并未改变

2022-04-19 14:49:38 293

原创 【牛客算法题】 --手套--C++

链接思路:这里的手套数量是对应的,但是取手套的时候并不知道对应颜色放在哪,都是混着放的。如果正常不考虑数量的情况下,只需要把一边的所有手套拿出来,另一边选一只即可。但是这道贪心算法题需要拿出最少的手套,需要得出最优解,无疑增加了难度。所以想要拿出最小数量,那么一边的手套量应该是:总数-最小数+1,这样才能覆盖所有的手套可能。那么另一边只需要拿出一只就可以。当遇到0只手套这样的情况,需要把另一边的手套都取出来。无论左手还是右手,都要取出另一边是0的手套,避免取到的手套正好是这只没有另.

2022-04-19 10:51:20 297

原创 【Linux操作系统】 -- 进程的控制--进程的等待

进程等待是什么?当一个进程fork之后创建了子进程,子进程就是为了帮助父进程完成某种任务,从而创建。那么为了让父进程知道子进程的完成进度,什么时候完成的,父进程需要通过wait/waitpid等待子进程退出,这种现象就叫进程等待。为什么要让如进程等待? 通过获取子进程退出的信息,能够得知子进程执行的结果。父进程派给子进程的任务完成的如何,我们需要知道。如,子进程运行完成,结果对还是不对,或者是否正常退出。 可以保证:时序问题,子进程先退出,父进程后退出的话。如果父进程没活过子进程,

2022-04-17 19:00:59 1431

原创 C++基础--继承

有的人说C++语法复杂,其实多继承就是一个体现。有了多继承,就存在菱形继承,有了菱形继承就有菱形虚拟继承,底层实现就很复杂。所以一般不建议设计出多继承,一定不要设计出菱形继承。否则在复杂度及性能上都有问题多继承可以认为是C++的缺陷之一,很多后来的OO语言都没有多继承,如Java继承和组合 public继承是一种is-a的关系。也就是说每个派生类对象都是一个基类对象。 组合是一种has-a的关系。假设B组合了A,每个B对象中都有一个A对象。 优先使用对象组合,而不是类继承 。完

2022-04-14 20:49:14 1113

原创 牛客算法题--幸运的袋子--C++

幸运的袋子

2022-04-14 00:05:33 683

原创 【Linux操作系统】-- 程序地址空间

为什么要有地址空间?1.通过添加一层软件层,完成有效的对进程操作内存进行风险管理(权限管理),本质目的是为了保护物理内存及各个进程的数据安全!(通过操作系统管理)2.将内存申请和内存使用的概念在时间上划分清楚,通过虚拟地址空间,来屏蔽底层申请内存过程,达到进程读写内存和OS内存管理操作,进行软件上面的分离。(物理空间滞后性开辟--写实拷贝是经典的之后开辟空间) 当我们申请1000字节,我们不一定能立马使用全部字节,在OS角度,如果空间立马给你,那么整个申请的空间,,本来可以给别人立

2022-04-10 21:45:36 1880

原创 【Linux操作系统】-- 环境变量

基本概念查看环境变量方法环境变量的导入 【永久路径】 windows环境变量 常见的环境变量环境变量相关的命令 命令行参数 通过代码如何获取环境变量环境变量具有全局属性

2022-04-08 12:47:49 2997

原创 【linux操作系统】进程的概念

冯诺依曼体系结构计算机都是由硬件组成的输入设备:键盘,磁盘(外设),网卡,显卡,话筒,摄像头等 读取文件就是从磁盘读取文件输出设备:显示器,磁盘,网卡,显卡,音响等(ms/s级别) 输入输出并不是独立的两套设备,比如磁盘,从磁盘读设备/向磁盘写数据 s秒级别的比如说网卡,别人给你发送数据,要等几秒。存储器(内存) 离cpu越近,越贵越小越快运算器和控制器(中央处理器CPU)ns级别是否可以不存在内存?直...

2022-04-05 21:06:15 920

原创 C++初阶 -- C++的IO流

1.C语言的输入输出2.流是什么C++IO流3.C++标准IO流 C++文件IO流C语言读写方法 C++读写方法 sstream

2022-04-04 20:38:17 520

原创 C++ -- 模板进阶详解

非类型模板参数当一个类,比如说栈类,我们要实现一个int的栈或者double的栈,只需要传一个参数模板,就可以解决。如果在这个栈的成员变量中,我们规定要写一个N个大小的数组,在C语言中,如果让定义的数字是个具体数字,那么我们能用到宏或枚举。如果要改变数值,只能改变宏或者给枚举增加数字。当实例化这个类,想要这个数组大小是可变的,可能传100,也可能传200。类型可以传模板,那么数字怎也像类型一样呢?#define N 100template<class T>class MyStack

2022-04-03 22:11:49 557

原创 stack&&queue 和优先级队列的介绍和实现

stack的模拟实现栈的实现可以放在链表中,也可以放在数组中等等,对于C++的栈,我们没必要像C语言一样,用什么容器就把什么容器实现出来,这样成本太高,我们可以用一个容器模板,在私有成员定义一个容器类的成员变量,相当于实例化了这个容器,再去实现一系列的函数。 template<class T,class Container> class stack { public: bool empty() const { return _con.empty(); } s

2022-04-02 14:52:55 1026

原创 C++算法栈类经典题--栈的压入、弹出序列 + 逆波兰表达式求值(栈的使用)+用栈实现队列

栈的压入、弹出序列题目链接class Solution {public: //拿入栈顺序去模拟出栈顺序,如果可以模拟出来,就是ok的,如果不能就不行。 bool IsPopOrder(vector<int> pushV,vector<int> popV) { stack<int> s; int i=0,j=0;//push序列的下标和pop序列的下标 while...

2022-03-31 19:21:41 285

原创 C++反向迭代器的原理+模拟实现+萃取

反向迭代器实际上就是在正向迭代器的基础上将其转换一下就变成了反向的,里面会传一个迭代器模板,这个模板随便是谁的迭代器模板,可以是list的,vector的等等,其只要有一个模板,引用了正向迭代器,其他SLT类型都可以用这个反向迭代器,这也是类型的力量,泛型就是这么强大。...

2022-03-27 18:52:11 383

原创 STL中list的基本原理及模拟实现

list的介绍及使用list和vector的区别list的模拟实现定义一个list节点类构造一个链表尾插成员函数迭代器类的实现前置++和后置++解引用重载const迭代器和第二个模板参数重载operator->list的增删查改insert和eraselist的拷贝构造,赋值重载,析构析构函数赋值重载和拷贝构造

2022-03-27 17:47:44 570

原创 vector类的模拟实现

1.基本结构拷贝构造赋值重载迭代器权限问题2.增删查改push_back迭代器begin和endreserve和resize删除pop_back插入insert删除erase

2022-03-18 20:29:20 488

原创 Linux一个小程序--进度条

回车换行的概念进度条代码

2022-03-17 13:10:13 1412

原创 Linux项目自动化构建工具-make/Makefile

使用背景理解原理make的一些其他用法

2022-03-16 15:17:24 1405

空空如也

空空如也

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

TA关注的人

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