自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 项目——boost搜索引擎

这个地方我们要注意一个问题,由于分词,所以一个搜索会被分为多个关键字,每个关键字都会查找到一些文章,而这些文章的内容很有可能是重复的,所以我们必须进行去重工作!然后我们可以看一下我们的网页文件,会发现里面除了网页的标题,内容,url之外其他的我们并不需要,并且这些东西会干扰对网页内容的提取,所以我们必须要去掉这些无用的标签!首先我们看我们的主框架,整个程序的思路是,首先我们要提取出整个文件的内容,然后将所有文件的内容写入一个文件,然后用分隔符进行分割,然后再对文件主要信息进行提取。

2024-04-15 20:11:23 1072

原创 高级IO——多路转接

每个被检测的fd都会被放入红黑树,一旦事件就绪,就会调用回调函数,让操作系统从红黑树中找到相关的rbn成员然后读取其信息,然后在等待队列中添加,这样就我们进行读取事件的时候就是在等待队列中读取事件了,并且在这个过程中事件主动回调,时间复杂度为o(1),比我们之前的select和poll效率拥有了质的提升!所以我们一般更青睐于多路转接的方法!也即如果设置为非阻塞的时候,我们反复读取,一旦读完就会出错返回,如果阻塞模式,我们就会阻塞在读的地方,这显然是我们不能接受的,所以我们要把读设为非阻塞模式!

2024-04-10 12:43:24 481

原创 ip协议和数据链路层!

简而言之,就是套娃!然后在一个公网ip内部再组建私网,这样就扩充ip数量,缓解了ip不足的问题!然后为了保证双方能确认彼此,每一次在公网除都会根据转换表将公网的地址转化内网的地址(相对于一个签证,在不同区域内标识身份一样)就可以实现双方数据的通信了!(如果报头,收到后面的自然知道报头有缺失,可以进行补发,如果中间有丢失显然会有偏移量没有连续,同理,如果报尾丢失,则会没有更多分片为0的报文(即片尾)同理可以查出来)!也就是用子网掩码的1的部分为网络号,0为主机号,1和0就划分了网络号和主机号的部分!

2024-03-27 11:45:43 1090

原创 Linux之udp/tcp协议

然后等待对方也将数据发送完以后,确定没有数据要发送了,也要断开连接,也发送FIN,同理左边也会发送应答!大家可以想如果1000-2000的应答丢失了,但是收到了4001,接收方也会知道对方已经收到了1000-2000的数据,这样我们就可以允许少量的应答已经丢失了!首先我们要知道接受方是有缓冲区大小的,如果我们完全不加限制的发送数据,就会很容易写满对方的缓冲区,而一旦溢出,这些数据就会被直接丢掉,肯定是不行的,所以我们必须对发送方进行控制!,压缩成了一次),然后开始发送的一方收到以后也发送ACK进行应答!

2024-03-22 22:43:41 758

原创 http/https协议

比如百度的搜索界面,这个就是URL(就是我们平时说的网址),其中www.baidu.com就是域名,也即网址是由域名+其他内容所组成的(一个完整的网址通常由协议、域名(可能包括子域名)、目录路径、查询参数和端口号(如果非默认)等),然后域名将会通过域名解析变成ip+端口号,实际访问的是ip+端口号!而GET则是在被包含在url里面的(这也是为什么会回显)!解决方法就是我们每次想服务器请求的时候,不仅要看我们的登录账号和密码,也会监测登录地点,ip等,如果出现了异常情况,服务器就会拦截我们的信息!

2024-03-20 23:39:22 1070 1

原创 Linux之网络套接字

首先我们在网络基础1的基础上就要先初步认识一下UDP和TCP协议此处我们先对TCP(Transmission Control Protocol 传输控制协议)有一个直观的认识;后面我们再详细讨论TCP的一 些细节问题.此处我们也是对UDP(User Datagram Protocol 用户数据报协议)有一个直观的认识;后面再详细讨论两者并没有绝对的好坏之分。通知像对可靠性要求非常高的就选tcp(银行等不允许信息丢失的),较低的就选udp(比如网络直播这种可以允许少量信息丢失的)。

2024-03-18 00:54:38 716

原创 Linux之网络基础1

网络发展背景:单机—>多用户远程操作—>网络独立模式:计算机之间相互独立。网络互联:多台计算机连在一起,完成数据共享。局域网LAN:计算机数量变多,通过交换机和路由器连接在一起。广域网WAN:将远隔千里的计算机连接到一起。

2024-03-15 13:17:45 856

原创 Linux之多线程

只要我们对资源进行整体加锁就默认了我们对这个资源整体使用,实际情况可能存在一份公共资源,但是允许同时访问不同的区域!(程序员编码保证不同的线程可以并发访问公共资源的不同区域!信号量本质是一把。

2024-03-13 19:12:33 900

原创 Linux之信号

通过下图,我们就会知道其实信号,阻塞实质上就是把我们的位图相应位置改为1就算是改变了状态,比如如果要阻塞2号信号那就把block表的二号信号比特位置1,如果我们要发送信号就把pending表置为1即可!答案就是我们的进程是要被cpu调度的,我们的进程是时间片调度的,所以进程会不停被调度,这个时候就要进入系统内核,这样我们就可以避免这种情况了!就是说正常情况是没有core dump的,但是如果我们开启了,那么如果进程出现错误了,它就会以文档的形式保存相关的数据,方便后面的排查和解决错误。我们来做实验看一看!

2024-02-19 10:25:43 832

原创 进程间通信(管道,共享内存,消息队列,信号量)

而半双工则是指在通信过程中的任何时候,信息可以从A传输到B,从B传输到A,但只能有一个方向的传输,不能同时传输。所以结构的开头都是Ipc_perm,这样我们就可以用一个ipc_perm指针数组保存管理任意类型的结构体(指的是共享内存,消息队列,信号量这些东西),然后要访问其中的数据时再强转成对应的类型就完成了我们的数据管理!命名管道也是通过文件缓冲区建立的通信的(管道文件与其他文件形式一样,只不过不向磁盘刷新数据而已),而匿名管道是通过血缘关系确定同一份资源,而命名管道是通过路径和文件名确定资源的!

2024-02-18 18:36:59 876

原创 Linux之动静态库

静态库,就是那个文件想用,就直接把库文件的内容拷贝过去,这样可以减少出现文件丢失的情况,略微提高运行速度,但是会造成巨大的空间消耗,大多数情况我们都选择动态库!并且把相关文件拷贝进去。然后这个时候再打包的时候再加上-I也即告诉gcc找头文件不仅要在当前目录找,系统目录找,也要到指定的目录进行寻找!所以我们只需要库加载之后,位置是确定的,我们之后就可以正常加载了!于是我们就可以得出一个结论,我们在函数跳转的时候就是在地址之间跳转而已!同理我们还要包括库文件,于是还要加上后面的语句去链接相关的库文件!

2024-02-15 20:46:53 1557

原创 c++之IO流

C++标准库提供了4个全局流对象cin、cout、cerr、clog,使用cout进行标准输出,即数据从内。盘)读取数据,并将值存放在变量中。提供了cerr用来进行标准错误的输出,以及clog进行日志的输出,从上图可以看出,cout、1.可以屏蔽掉低级I/O的实现,低级I/O的实现依赖操作系统本身内核的实现,所以如果能够屏。5. 对于自定义类型,如果要支持cin和cout的标准输入输出,需要对<<和>>进行重载。“流”即是流动的意思,是物质从一处向另一处流动的过程,是对一种有序连续且具有方向性的数。

2024-01-31 18:41:07 783

原创 c++特殊类的设计

如果单例对象构造十分耗时或者占用很多资源,比如加载插件啊, 初始化网络连啊,读取文件啊等等,而有可能该对象程序运行时不会用到,那么也要在程序一开始就进行初始化,然后我们为了在一开始就加载,我们就必须在main函数之前创建,所以我们必须使用全局变量。但是如果我们直接禁止掉拷贝构造又会导致我们返回的时候出问题,属于伤敌一千,自损一万。一个类只能创建一个对象,即单例模式,该模式可以保证系统中该类只有一个实例,并提供一个。但是又因为我们不能在类外进行创建,所以我们可以直接在类里面创建一个类一直保留着就行。

2024-01-30 17:16:23 360

原创 C++11

前者在针对一个智能指针的时候是正常的,但是如果有多个资源的智能指针,最后就会撞在一起了,所以也不可以用。emplace_back是C++11标准中引入的一个方法,用于向容器中添加一个元素,它与push_back类似,但在使用上具有更高的效率。正常情况下,左-》右,左边析构以后--为0,析构自己会导致右边的计数--,然后出作用域的时候右边本身就--,然后也为0,进行清楚。万能引用的声明方式为。不过不要轻易进行移动赋值,比如此处s1的资源就被给给s3,而自己的资源没了,容易引发问题,一定要谨慎使用。

2024-01-30 13:37:06 928

原创 c++之哈希

这意味着索引值是由插入项的值所确定的,当你需要判断列表中是否存在该值时,只需要对值进行哈希处理并在相应的索引位置进行搜索即可,这时的搜索速度是非常快的。但是 HashMap 的实现也有缺点,例如存储容量占比高,考虑到负载因子的存在,通常空间是不能被用满的,而一旦你的值很多例如上亿的时候,那 HashMap 占据的内存大小就变得很可观了。(比如,如果有人还书,是2023年12月1日借的,名字叫张三,那我们就可以直接去2023年12月1日的,首字母是Z的信息处找,如果找到那就完成还书,如果找不到就存在问题)。

2024-01-11 11:38:13 1000

原创 二叉搜索树(AVL树,红黑树)+封装

这个地方我们要注意,因为最左节点可能还有右子树,那么这个时候我们可以先记录父节点,方便进行重新连接,如果右子树只有一个节点,这个时候subleft将会是parent的右节点,除此之外都会是左节点。然后就是旋转的情况,先分成祖父节点的左子树和右子树,分为单旋和双旋(看插入节点是父节点的左还是右),最终都是将cur放到祖父节点,然后保持更改颜色即可。通过值的大小选择不同的走向,一直到遇到一颗树正确的根节点的正确插入位置。其中左旋就是将要旋转的父节点的右节点的左子树交给父节点,然后将父节点变成右节点的左子树。

2023-12-21 19:39:30 872 1

原创 priority_queue的实现,容器和仿函数

我们先写好我们的模板和成员,这个container就是我们的容器,它可以复用我们的其他stl,这样就可以屏蔽底层细节,只要container能够实现我们等下所需要的功能,就可以实现完美复用。然后通过我们push,pop,tiop,empty的实现我们就可以发现通过container的接口我们很容易就实现了我们的功能,这就是容器的作用。同理我们的less,也就是我们的仿函数,本质其实就是一个类,但是重载了()这样我们就可以发现我们容器的作用,我们不用再具体实现。然后我们实现向上调整和向下调整。

2023-12-15 15:20:09 359

原创 C++STL之List的实现

然后我们来研究list的构造函数,首先我们要写一个空链表的构造,也就是头节点的构造函数,可以为我们的无参构造和初始化提供方便。迭代器的作用其实就是将容器内容的访问与修改进行包装,使得使用的程序员可以不直接对底层数据进行修改,这样不仅提高了数据的安全性,并且提高了使用者的规范性和代码的可读性。迭代器中实际的成员仍然是我们的原生节点指针,但通过迭代器的包装,就避免了我们直接使用节点,更避免了我们直接操控节点的数据域和指针域,起到多重包装的作用。首先我们先分析迭代器和List的类的基本成员和模板的使用。

2023-12-12 19:03:44 789

原创 c++之STL

然后我们实现size()和c_str(),其中c_str就是可以将string类型转换为char*类型返回。但是要注意用in.get()提取,如果用in由于cin会省略空格和回车,会导致陷入死循环。insert实现的时候要避免end变成负数(size_t变成负数就会是无穷大)首先我们需要实现string的构造函数和析构函数。然后实现find和substr这都是和数据结构的实现非常像的。通过运算符重载,我们就可以实现string的[]访问。然后我们实现+=和append。然后就是流插入和流提取的实现。

2023-11-29 19:19:00 476

原创 Linux之gdb

gdb就是一个Linux的调试工具,类似与vs里面的调试。可执行程序也有格式,不是简单的二进制堆砌。

2023-11-12 20:11:54 217

原创 Linux之make/maakefile

可以通过fflush(stdout)强制刷新缓冲区。printf打印并不是直接给屏幕而是先放到缓冲区。换行是指直接到同一位置的下一行,回车是回到开头。access不是实时更新的。

2023-11-08 18:12:22 79

原创 linux系统编程之gcc/g++

两者都是编译器,只是针对目标不一样。可以用来进行不同版本功能的裁剪。

2023-11-07 09:06:44 108

原创 unity工程

其中1是不能丢失的,其他的如果丢失,再次打开项目的时候会被重新恢复,如果1被删除则无法恢复。能被摄像机拍到的部分就会在game窗口看见,这也是玩家能看见的窗口。然后可以调整全局和局部,这样可以改变这个坐标系的相对对象。通过面向对象的思维,将脚本挂在物体上。是否打勾反应的是物体是否被激活,只有激活的物体才有用。缩放可以对物体的三个维度进行缩放或者进行整体缩放。2d一般是在做2d游戏的时候使用的,3d一般不用。6:projectsettings:工程设置信息。眼睛可以隐藏物体,手指则可以让其在场景上被点到。

2023-11-03 20:29:46 312

原创 C++类和对象

除了静态成员变量还要静态成员函数。友元可以突破类的私用进行访问。首先我们要讲static。以下是static的总结。新编译器会出现下述优化。

2023-11-03 08:53:19 60

原创 c++之类和对象

首先我们要理解cin,cout只能自动识别内置类型,原因就是因为cin,cout里面的函数重载。自定义类型则会自动调用相应构造函数,如果没有则无法运行。成员初始化既可以用函数体内初始化也可以用初始化列表。初始化列表可以解决一些函数体内初始化解决不了的问题。如const变量的初始化问题,引用成员的初始化问题。如果内置类型参数,没有指定初始化,会初始化为随机值。那么如果我想输入非内置类型,就要进行运算符重载。友元函数可以访问对象的私有。但是会发生如下的情况。

2023-11-01 16:03:13 106

原创 c++之内联函数

内联函数类似与宏的优点,但是克服了宏的缺点。(内联函数编译器通过宏实现了内联函数)因为内联函数会展开,如果大函数可能会导致指令函数暴增,导致程序大小暴增。要学习内联函数(inline),首先我们要复习一下宏的缺点。但是一般只适合小函数(10行左右为界限)我们的目的就是用内联函数去替代宏。但是是否展开会取决于编译器。

2023-10-30 10:41:51 64

原创 Linux之系统编程

可以通过yum install -y epel releaese进行安装。基础软件源可以保证稳定性,一般用久了也可以把扩展软件源移一部分过去。你每一次写的时候都会自动保存一个备份xxx.x.swp的隐藏文件。不同的商业操作系统内核都是一样的,主要是配套社区不一样。在命令模式里面按shift+:就可以进入底行模式。vim(可以当成编辑器,vim是vi的升级版)1.yum list可以出现所有可下载的程序。在插入模式里面按Esc就可以退出了。D也可以删除上次写的异常部分代码。R可以恢复上次写的代码。

2023-10-29 23:02:24 833

原创 c++之类和对象

写任然用d1-d2,d1>d2等写法,但其实已经转化为,d1.operator-(d2)不要在构造函数里面直接写本类,否则后引发无线调用。(可以使用指针或者引用)。这个问题就只是访问了this的类,并没有访问this所有是正常运行。同一个类,不同的成员在这个类里面访问都不受限制。运算符重载,参数要和原符号参数个数相同。一个新的函数,都最少会有6个默认函数。浅拷贝在c++由于析构函数将会出问题。由于有一个this指针,故只能写一个。而这个访问了成员变量,就出现了报错。this可以显示使用。

2023-10-26 15:06:05 85

原创 linux之权限

文件匹配只进行一次,哪怕你处于所属组拥有权限,如果你是拥有者,但没有这个权限,也没用。只要拥有目录,那么在这个目录里面的文件哪怕什么权限都没有,都可以进行删除。将文件权限给别人必须使用sudo或者root才行,拥有者也不能直接给。char,字符设备文件,终端就是一个字符文件。flie可以查看更完整的类型。block大多数就是指磁盘。进入一个目录需要运行权限。查看详细信息需要读权限。

2023-10-23 11:32:36 72

原创 c++之类和对象

如果有域作用限定符,那么就会把变量和函数都限制在域中(此处是stack里面)sizeof()只算变量大小,不算成员函数(成员函数不在类里面占空间)一般推荐定义与声明分开,但是在类里面定义的函数默认就是Inline。一个域作用限定服,一直作用到下一个域作用限定服。struct默认公有,class默认是私有的。不占空间叫做声明,占则是定义(也叫实例化对象)auto真正的价值可以简化迭代器的写法。并且auto定义的变量必须初始化。c++里面花括号定义的都是域。返回值也不可以用auto。可以自动推导结果的类型。

2023-10-21 17:34:54 94

原创 C语言之排序

非递归版本则是主要通过gap控制每次归并得个数,实现,2个归,4个归得顺序。首先我们对进入的数组进行建堆,升序建大堆,大的在上,然后依次将堆顶和最后一个叶子节点交换,然后再将顶点进行下滤。一边走到不符合一边区间的值,另外一边再走知道都到了不符合的地方进行交换,直至相遇,交换完毕,将key放入。这个思想是基于插入排序的升级,开始就先将相距较远的数进行调整,减少后面的无用微调。第一种霍尔经典排序,取左值作为key则右边先走,反之左边先走,防止卡死。第二种,挖坑法,先传值,然后把坑给丢过去。

2023-10-21 10:07:28 1033

原创 Linux的环境搭建和基本命令

首先我们可以使用虚拟机也可以使用云服务器。然后输入ssh root@公网地址就可以成功登录你的云服务器了。linux里面的目录相当于windowns里面的文件夹。加一个f强制删除(rf还会再询问一次,-f会直接删除)叶子节点一定是普通文件或目录,中间节点只能是目录。可以向当前目录拷贝文件,也可以向其他目录拷贝文件。可以去阿里云,腾讯云等购买一个云服务器。-i(ignore)忽略大小写的区别。d开头是目录,-开头是普通文件。重定向拥有创建新的文件的能力。日志是为了能够回溯问题而生的。

2023-10-16 22:06:44 65 1

原创 c++命名空间,缺省参数,引用,this指针

此处直接double&不能成功的,但是加const就可以了,是因为很多时候赋值的时候会产生临时变量(会被设置为常量)(例如此处发生了类型转换(类型转换会产生临时变量)),所以用常量才可以接受。并且只能在声明的地方给默认值,不能在定义的地方给。防止2个地方给的值不一样,也防止只用了声明的时候,没有默认值。就是使用std(c++官方库定义的命名空间)这个命名空间里面的命名。可以规定参数的默认值,如果不传入相应的参数则直接使用默认值。有时候虽然是重载函数,但是使用的时候存在歧义,不能正常使用。

2023-10-15 17:14:05 77

原创 数据结构之堆排序和前,中,后,层序遍历,链式二叉树

因为我们大多数人认为应该将堆顶的数据输出,但如果这样就会导致堆顶出堆以后,堆结构会被破坏,显然我们不能这样。此处是为了了解二叉树的结构,故重点不在增删查改,故为了方便期间,搭建好结点的信息以后,我们手动造树。首先我们要知道升序我们要建小堆,降序建大堆,这与我们的大多人直觉相违背。树的遍历分三种递归遍历,前,中,后序遍历和一种循环遍历,层序遍历。所有我们反其道而行,每一次将最后一个子叶进行出堆操作。再通过数学运算,堆排序的时间复杂度是N*logN;并且从上往下建堆比从下往上要快。现在我们要开始学习树的遍历。

2023-10-14 10:36:24 231

原创 数据结构之堆的实现

首先我们要想堆应该用什么实现,我们这里可以使用数组,因为每一层的数是有限个的,所以我们可以很容易将数的每一个位置对应到数组中去。然后我们通过Adjustup去维护大,小根堆的堆放。(此处实现的是大根堆)将最后一个元素移动到堆顶,然后再进行下放,维护大根堆。将其与父节点比较,然后进行移动,直至合适位置。然后我们实现判断是否为空和显示堆顶元素。那我们就可以仿照顺序表写出我们的结构。最基本的功能初始化和销毁,不再赘述。然后我们要考虑我们要实现哪些函数。然后就是本贴的最后的功能,出堆。然后我们实现经典的功能入堆。

2023-10-11 22:24:50 287 2

原创 单调栈和单调队列

首先我们看到这个题目,大多数人第一想法应该是暴力算法即每往后面走一个就将其与前面的所有数字进行比对,显然这个算法的时间复杂度是o(n^2).那么我们肯定要去降低时间复杂度,那么势必要去研究简化的方法。首先我们要想如果你在遍历的过程中,如果一个数(Ai)的右边有一个比这个数还小的数字(Aj),那么在Aj右边的数字如果遍历了Aj都不符合,显然遍历Ai就是一种算力的浪费。那么这个时候我们就可以想一个方法去解决这个问题就是在遍历的过程中直接去掉前面不符合的数,使后面遍历的时候不至于再重复遍历。

2023-10-11 09:18:34 39

原创 数据结构之堆,栈的实现

为了避免每一次调用的时候还要输入头,尾指针,直接进行打包成结构体。然后我们就要实现队列的头显和尾显已经判断是否为空的实现。首先我们分析由于只需要尾进尾出,用数组模拟更简单。由于需要头出尾入,所有用链表实现更好。capacity表示栈的容量。top可以表示栈中元素个数。销毁栈的实现(防止内存泄露)最后就是判断队列大小的实现。大小和检测是否为空的实现。再就是栈的插入和删除。然后实现显示栈顶元素。

2023-10-08 19:15:05 212

原创 STL关联式容器set,multiset,pair,map

不可以直接修改set或multiset容器中的元素值,因为该类容器是自动排序的。set.count(elem)查找数值为elem的迭代器,set只有0或1.multiset可能会更多。第二种使用find()Hanshu1.成功返回对应的迭代器,失败返回end()的迭代器。set.lower_bound(elem)找到第一个>=elem元素的迭代器器。set.higher_bound(elem)找到第一个>elem元素的迭代器。set.erase(elem)如果没有就会返回0,有就会删除并且返回1。

2023-10-02 22:02:02 818

原创 STL学习笔记之stack,queue容器

vector,deque,list,stack,queue容器都是序列式容器。返回boll值表示是否为空。stack.top()可以返回栈顶的元素值。queue.front()可以获取头的值。queue.back()可以获取尾的值。接下来我们要知道stack的构造函数。同理有queue.push()下一篇文章我们来介绍关联式容器。queue的构造同其他的容器。没有迭代器,即不可遍历。queue拷贝与赋值。

2023-10-02 19:26:03 44

原创 STL学习笔记之deque,list

例如迭代器指向的节点的next指向的节点已经被删除。list容器顾名思义是一个链表容器,并且是一个双向链表容器。list.insert(pos,num)(pos只能使用迭代器)但是list是不可以随机存取元素,所有不支持[]和at.()list.remove(elem)删除与elem相同的数据。list.erase(beg,end)清除区间里面的数据。list.rend返回倒数最后一个元素的后面的迭代器。list.begin()返回容器第一个元素的迭代器。list.end返回最后一个元素之后的迭代器。

2023-10-02 18:55:54 73

空空如也

空空如也

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

TA关注的人

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