自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 STL空间配置器

当没有足够的空间的时候,会向上申请,有可能有80,88,96等有这样的数据块。下次再申请的时候64字节块再申请的640字节直接交给refill,而不是再申请空间,因为原本的s_start_free 和 s_end_free在32字节块划分完成以后差值是640,在64划分完以后,两者又相等了。vec取地址不能取到第一个元素的地址,但是arr取地址可以得到第一个元素的地址,因为vec的元素是在堆上的,arr的元素是在栈上的。问题:空间的申请与对象的创建两者分开,因为不断创建的时候可能会频繁的申请空间扩容。

2024-07-02 10:26:28 344

原创 6.24c++ 容器库(序列式,关联式,无序式),算法库,迭代器,适配器,

第一个片段是由一个开始迭代器指向,第二个片段是由结束迭代器指向,其中迭代器中有四个指针cur指针在开头的位置是指向开始片段的首位置,first指首元素,last指尾元素的下一个地址,mode指向这个中控器二级指针,当这个片段满了需要再申请新的片段就找到这个中控器数组在前面再加一个中控器指针。在deque中插入元素的时候,如果是在前一半插入的时候就将it前面的元素向前挪动,那么it指向的元素就是不会改变的,如果是在后面的一半插入,就会将it位置以及后面的元素向后移动,所以it就会指向新插入的元素的首元素。

2024-07-01 14:39:57 888

原创 6.20模板

将类型也参数化模板可以分为两类,一个是。

2024-06-26 09:59:11 587

原创 6.18 多态

多态相较于继承是更加重要的体现面向对象的特征。多态: 同一个消息、同一种调用,在不同的场合,不同的情况下,执行不同的行为。背景需求:继承是实现可以在圆柱或者圆锥中复用圆的特征,多态是可以通过一个圆直接就可以调用圆柱的体积,或者调用圆锥的体积。继承实现了很好的代码复用性,多态的实现可以更好的降低耦合性,若高耦合在修改代码的时候往往需要修改多出。多态分类:静态多态(编译时多态)和动态多态(运行时多态)

2024-06-26 09:58:53 820

原创 6.21 移动语义与智能指针

也就是会尝试移动函数不行再常规。

2024-06-21 20:59:30 573

原创 tinyxml

github下载相关的软件包,其中有四个文件需要主要需要关注就是分别是tinyxml12.cpp,tinyxml12.h,rss网页xml文件,还有就是官方给的test文件tinyxmltest.cpp。最后在编译的时候记得gcc test.cc tinyxml.cc 进行联合编译,要不然的话不能知道相关的在hpp中的函数定义在什么位置。然后就可以借助于regex函数借助于正则表达式处理字符串文件。当然在下面的文档中是通过gpt获得的一种替换方法。example1就是提供一个打开文件的方式。

2024-06-21 09:26:39 322

原创 6.17继承

面向对象的特征:封装,继承,多态使用背景:比如说在动物类底下可以有带毛的动物,带毛的动物符合所有的动物的特征,只是在这个基础上再继续添加一些特征命名:原有类型称为“基类”或“父类”,在它的基础上建立的类称为“派生类”或“子类”。区分:成员元素也是有这三种方式public,…,…。和继承一样继承方式感觉就像是加上一层的感觉,原本的元素的属性是对于派生类(派生类内部)来看待,例如而对于派生类对象(派生类外部)而言经过保护继承而言已经变成了保护属性。区分:保护继承和私有继承的区别体现在继续派生的时候,如果在

2024-06-19 15:33:20 730

原创 6.8日志系统

回卷的机制是:先生成一个wd.log文件,该文件存满后接着写入日志,那么wd.log文件改名为wd.log.1,然后再创建一个wd.log文件,将日志内容写入其中,wd.log文件存满后接着写入日志,wd.log.1文件改名为wd.log.2,wd.log改名为wd.log.1,再创建一个wd.log文件,将最新的日志内容写入。【注意】RollingFileAppender构造函数的参数如上图,其中要注意的是回卷文件个数,如果这一位传入的参数是9,那么实际上会有10个文件保存日志。

2024-06-13 09:28:29 732

原创 6.11运算符重载

【注意】前面的const是不能修改指向,后面的那个const是不能修改其中的内容,但是如果是存的是一个指针的话,那么是不能修改这个指针指向,但是其中的内容也是可以进行改动的,如果不想让内容后序改动只能初始化的话,那么就在private那个指针的前面加上const。但是M中的指针依然是指向这个位置,当M销毁的销毁的时候调用析构函数清理堆上空间的时候就出问题了。原因:因为在查找的时候就直接从程序代码区就可以找到相应的类名对应的成员函数,不会用到这个对象,但是当访问对象中的成员的时候,需要借助于这个对象指针。

2024-06-13 09:28:08 1116

原创 6.7 输入输出流

clear()调整为流的状态为goodbit,但是因为输入是字符串但是读入进行存储的地方是int类型,所以没有能够清空这个输入的缓冲区,所以需要将缓冲区进行清空。所以说clear调整流的状态需要和ignore函数结合使用,ignore默认是忽略1个字符,不要忘记忽略最后的换行符,所以说需要设置足够的可以忽略的字符数ignore(4)用来忽略you\n。无参构造的时候借助于open将创建的文件输入流与文件进行绑定,文件不存在的时候流的状态变为failbit状态,这个时候添加一个判断语句。

2024-06-08 16:27:02 803

原创 6.4 类与对象

【注意】#pragma pack(4)取默认(声明的数据类型中最大的那一个)和自己在该行写的大小中小的那个进行比较,选择小的那个进行内存对齐。类的定义放在头文件中,但是出现的问题就是成员函数当数量比较多的时候,如果将函数的实现全部都写在类中,会比较混乱。【注意】变量的声明顺序(private中写的顺序)决定变量初始化的顺序,和自己写的变量的初始化的顺序没关系。,是用户定义的数据类型,对象可以看成某个类的实例(某类的变量)。上述的初始化的方式其实是一种赋值方式,下面的一种方式是一种标准的初始化的方式。

2024-06-04 18:01:57 1001

原创 c++与c

对比使用using编译机制如果全局变量和namespace中变量名字相同会出现冲突,但是使用using声明机制在局部使用的时候会对于全局变量形成屏蔽。对于int和double来说效果是一样的。当不清楚命名空间中的具体情况的时候,不要使用using,因为可能出现命名空间中的实体和自定义的变量和函数出现冲突。include多个头文件,首先放自定义的头文件,再放C的头文件,再放C++的头文件,最后放第三方库的头文件。命名空间中的内容可以进行定义或者声明,命名空间中不能使用实体,也不能对于声明的实体赋值。

2024-06-03 11:54:01 1275

原创 c++框架介绍

对比使用using编译机制如果全局变量和namespace中变量名字相同会出现冲突,但是使用using声明机制在局部使用的时候会对于全局变量形成屏蔽。当不清楚命名空间中的具体情况的时候,不要使用using,因为可能出现命名空间中的实体和自定义的变量和函数出现冲突。面向对象的编程,万物皆对象,c++的主要的特征,c++的特征有很多种,结合各种语言特征。4.日志系统:拿到一个新的程序,怎么读取借助于日志系统?7.继承:从大的类别动物到具体的动物,会有一些性质的继承,也会有自己的特殊的特性。

2024-06-01 11:59:31 370

原创 5.21数据库mySQL

一开始我们设置的是库编码格式,表和行的编码格式都是跟随库的编码格式。以后的表的格式会变就混乱了。使用者是不关心数据库的实现(也就是不管是哪一个数据库),只是关心结果是什么样的。也就是sql语言,都是一样的,数据库就是接收这样的标准化语言,实现响应的功能,底层啥样无所谓。前面一个socket用于和用户进行沟通,后面的一个socket用于和数据库进行通信,后面的一个socket是不用自己写的,是封装在一个动态库中,直接使用SQL语言就可以。mySQL就是这样的一个软件,其中有读写的逻辑进行磁盘中数据的管理。

2024-05-21 17:55:11 634

原创 5.20Git

去公司需要清楚公司的远程仓库是存在什么位置,有可能是在公司自己的服务器上,有可能也是在gitee上如果是在gitee上的话连手机热点的话就可以获得。在执行git命令的时候需要注意是在工作空间中进行执行,其中会有两种情况可以实现就是可以在含.git的文件夹中(在这个文件夹中创建文件),也可以在这个位置创建一个文件夹在这个文件夹也可以。【注意】当在dev1分支在继续向后进行处理的时候需要在dev1进行merge进行合并,再写dev1的时候再从主逻辑继续创建分支,避免冲突混乱。

2024-05-20 17:57:43 658

原创 5.18线程池

【最重要的区别】进程之间的关联度比较弱,所以说当我们在打开一个网页的时候就是一个进程一个进程崩溃的时候其他的进程不会很受影响。但是像是游戏的场景就需要是线程来实现,当一个线程崩溃的时候其他的线程也就直接崩溃了没背景怎么打游戏。所以说要让线程有序的退出。信号与线程是不适配的,因为信号是与进程适配是放在进程内核中的一个struct中,所以不知道这个信号是传递给哪一个线程。【注意】同一进程的线程是共享文件描述符的,所以说可以直接在队列中直接存储文件描述符就可以,当有一个新的任务到来的时候就让主线程唤醒子线程。

2024-05-18 11:57:26 342

原创 5.16 进程池

结合前面学习到的epoll,当一个用户连接进来的时候,会分配一个专门的socket文件对象专门用于和一个用户进行交流,结合开头的场景,我们同时也开辟一个进程服务这个客户端。控制部分有一个专门的结构体cmsghdr,这个东西的长度是不固定的,因为主要是有一个可变长度的数组。其中的第四个参数是一个数组,但是我们只是想要存一个fd,所以我们获取这个数组的起始地址,这个起始地址是从一开始的位置+12通过一个宏来实现。枚举类型标记忙或者是闲,进程结构体中包含进程的pid,状态,要传递的fd。一般是填充字符串类型、

2024-05-16 23:13:11 601

原创 5.13网络编程

struct in_addr 与 in_addr_t类型是一 一对应的,就是说在结构体中实际上存储的就是in_addr_t,所以说在使用的时候注意区分两者。【注意】但是一套接口接口可以适用于ipv4和ipv6的通信,所以bind等函数中使用这样一种struct sockaddr通用的一个类似的说明符实际上却没有这样的一个结构体定义,所以在实际应用的时候将sockaddr_in或者sockaddr_in6强转为sockaddr类型。【注意】区分大小端的时候是按字节进行划分的,字节内的数据是有序的。

2024-05-13 17:56:55 839 1

原创 5.9网络协议

将数据进行发送的时候需要借助于网线实现,这个时候会出现当传输的数据比较远的时候就借助于中继器将信号进行再生扩大,当多个机器需要交流的时候就使用集线器多个点连接(星型),但是数据不能隔离会出现a给b的数据会发给每一个点数据就非常多,所以使用网桥隔离一片区域,使得数据不要发送超出这样的一片区域。访问一个网站首先是先返回一个html代码,解析代码发现有图片然后就去发起请求然后拿图片以及图片的相关的信息,如果刷新的时候将图片的相关信息发送过去,如果图片的信息没有改变,就不会再返回图片,而是要求用户端从内存中加载。

2024-05-11 11:56:53 579

原创 5.7 线程

对于linux操作系统而言,每一个线程都有一个task_struct(主要就是栈的信息栈的地址,其他的重要信息都是存放在进程的struct),注意进程也会维护一个大的task_struct,如果说有两个线程,那么就会有三个struct。相较于父子进程是通过返回值进行判断,线程创建以后是通过自己独立的一个函数来进行实现,理解主线程的入口函数是main函数,但是子线程的入口函数是自己额外定义的函数。调用这个函数,这个线程会修改另外一个线程的退出位,但是可能不会进行检查所以说这个时候线程是取消不掉的。

2024-05-07 19:49:23 506

原创 5.6信号

中断就是对于一个硬件的紧急事件的出现响应的一整个流程。信号就是一个进程发送给另外一个进程的信息。

2024-05-03 22:35:37 135

原创 5.3 进程间通信管道和共享内存

ftok("1.txt", )通过某一个文件产生一个key,究竟是哪一个文件不重要,还有另外一个参数,也是帮助建立不同的键,所以说只要有一个不一样的就会是一个不一样的共享内存区域。管道出现的问题当需要交互的进程比较多的时候,管道的使用次数就比较多,同时从内存拷贝到内核中然后从内核态再拷贝到内存中,比较耗费性能。一般各个进程之间都是在逻辑有自己的一片虚拟内存,往往各个进程的物理部分也存在不同的位置不能直接进行交互,可以借助于共享内存的方式进行交互,在物理上共享一片内存。共享内存的键值对也是这样的道理。

2024-05-03 19:26:09 251

原创 Linux编码常出现的错误

6.对于fork()函数的理解其实一开始是错的,因为fork实际上并不是在一开始就只执行一遍,fork真的是复制进程,会将前面的进程全部都重新执行。3.有时候可能需要多多个文件流,后面的文件流如果不能打开的话就需要关闭前面的文件流,所以不能简单的用ERROR_CHECK。5.对于文件的初始化memset(str, '\0', sizeof(str));缓冲区未清空的情况,没有加\n。4.注意字符串的最后一个字符是'\0'也可以bzero(*s, size);

2024-05-02 21:05:29 402

原创 5.2 进程

父进程一般都会给子进程收尸,前提时父进程退出,借助wait函数和waitpid收尸,他们是阻塞函数,但只能收一个,如果确定没有需要收的了就返回别的值。建立一个会话有一个前台进程组(fork)和多个后台进程组,只有前台进程组可以接收键盘信号,这也就是为什么ctrl+c不能停止后台进程组。fork进行立即的逻辑复制父进程,实际上物理写时复制,也就是因为很多的东西都是相同的,但是很多东西可能不会用到,所以说只有在需要用到的时候才会在物理上复制父进程的数据。pipe函数在父子进程之间本身不就是创建两个管道?

2024-05-02 21:05:23 380

原创 4.30进程

关于操作系统的发展,一开始一个一个处理(批处理)----读写等不使用cpu还占用---》将这个时间分给需要cpu的程序(多道批处理)----------不能及时处理请求-------------》分时(分的很细感觉个进程都可运行)如何适应处理操作系统带来的诸多任务-------》通过进程进行解耦(真的无关联)每个任务独立出现------》也就是进程认为自己是独立操作一块虚拟空间所以可能需要进行虚实空间的转换。-----》就会出现上下cpu的情况(几种状态,调度问题)

2024-04-30 23:27:02 99

原创 4.29 IO多路复用

管道,就是用于进程之间的通信文件,根本不会用到磁盘内容,只是用来标记一块缓冲区,所以无论任何时候大小都是0。管道必须要同时打开,只开一端是不行的,这样的话不能进行后续的操作,会卡在那里,设计问题。为了能够让管道想说就说,说了就能相应就需要协调他们之间的关系,阻塞以及及时响应。管道打开文件的时候需要注意打开的权限,一端只能是读,另一端只能是写。其中有几种方法,一种比较传统的是select通过分组轮询得知,但是管道通信的方式是半双工的,因此建立两个管道进行双向通信。管道(进程通信单双工, )--》

2024-04-29 22:42:48 123

原创 C语言 流文件

int fprintf(FILE* stream, const char* format, ...), 输出错误信息就fprintf(stderr, const char* format, ...),如果是fprintf(stdout, ...)文件指针位置的问题,c语言输入和输出只有一个流,不像c++或者是jave有两个流,因此说当开始读文件然后再写文件的时候就相当于追加写入。因此在模式选择的时候权限要少给,只是满足够用就可以,只读就r, 只写就w,追加模式打开就a。输出流缓冲区需要手动刷新。

2024-04-22 19:09:47 594

原创 C语言 语法

虚拟内存的堆和数据结构的堆没有关系,数据结构的堆理解为特殊的完全二叉树(大小顶堆仅仅是根节点是最大的或者最小的,没有其他关系)快排普遍采用递归实现,并且用于大的数据集,如果数据是接近有序的情况下可能会出现栈溢出的情况。堆排序与数据本来的情况是无关的(与归并排序一样),构建大顶堆的时间复杂度是O(n)在进行堆排序的时候,并不需要额外的内存空间,将原地的数组视为一个堆构建为大顶堆。堆化的时间复杂度是O(logn),总的时间复杂度是O(nlogn)对于稳定性的判断,如果是长距离交换就容易出现不稳定的情况。

2024-04-22 19:09:29 306

原创 C语言Linux vim shell命令

多行注释 ctrl + v + I + // + esc 修改以后用@a快速。将文件进行格式化整齐,gg =G (格式化) gi (回到格式化以前的位置)diw删除单词并保持在视图状态,ciw删除并进入插入状态。f"向后寻找"找到,直接找到本来的位置。t"向后寻找"找到,找到前面一个位置。ci”删除到“并且进入编辑模式。ggdG先到开头再删除到末尾。yw复制到下一个单词词首。v行选,ctrl+v列选。

2024-04-20 16:18:28 350

原创 将数组元素转化为指针的方法

1. 数组名作为指针。

2024-04-11 19:02:28 202 1

原创 C语言——指针的高级引用

动态内存分配二级指针:啥叫函数指针:啥叫往往出现在在一个函数中free过,后来忘记了又在另一个中free。所以说free交给特定函数销毁(就像专门的人做清洁)和creat函数一样,需要注意这点!

2024-04-11 17:28:43 1324

原创 代码随想录 Day37 738.单调递增的数字 968.监控二叉树

738.单调递增的数字738.单调递增的数字思路:1. 本题的核心思想是在于当元素不够减的时候就会变成9,这个需要通过多个例子就会发现。问题:1. 本题可以通过将int类型数字变为string类型的数字方便对于每一位进行操作,用到函数to_string()和stoi()函数,同时记得对于每一位的元素需要对于元素的值进行改变的时候,需要加' '因为这个时候每一位上都是一个char类型。

2024-04-03 22:01:16 262

原创 代码随想录 Day36 435. 无重叠区间 763.划分字母区间 56. 合并区间

1. 本题的思路主要就是修改元素的区间有难度,这个地方需要建立一个新的数组进行保存,通过back()修改区间的元素值。思路:通过对于上一道题目的学习以后本题的思路就简单太多,依然是同上的思路,知识需要注意修改if判断语句中的内容。思路:本题的思路依然是比较巧妙的。当想到可以首先遍历一遍记录字母的最远位置的时候,本题基本就已经解答了。1. 了解并且熟悉二维数组的result.back()[1]这种表示。435. 无重叠区间。435. 无重叠区间。763.划分字母区间。

2024-04-03 21:11:54 238

原创 代码随想录 Day35 860.柠檬水找零 406.根据身高重建队列 452. 用最少数量的箭引爆气球

一旦有超出该范围的,则需要再添加一支新的jian。思路:本题的思路虽然没有想到,但是确实和之前的进行两边走,两次进行排列的思想很类似,首先是对于身高进行排序,因为我们看的是有多少个比自己高的站在前面,所以说应该让身高比较高的元素放在前面,如果身高是相同的就让表示有多少个比他身高更高的元素更小的放在前面。可能稍微有些想复杂了,因为想到需不需要进行排序等等问题,以及如何从容器中取出相应的元素,实际上没想到啊没想到居然可以直接一波变量定义,给我整懵逼了,下次记得!思路:整体思路依然是很新颖。

2024-04-03 16:56:51 322

原创 代码随想录 Day34 贪心算法 1005.K次取反后最大化的数组和 134. 加油站 135. 分发糖果

就是如果说总油量是够用的情况下,那么那个起始点是会出现在累加油量为负值的下一个位置,如果出现多段负值的情况只能说明前面那每一段累加之后都是负值,只能说后来的一段是正值的话可以弥补,但是如果是总油量也是负值的话就是不行的。比如说第i个元素它比i-1的元素要大,i-1比i元素要小,所以说在第一次遍历中使得右边糖果多,第二次遍历使得值是持平的,所以取最大值是可以满足两种情况。如果说左边的孩子比右边的孩子大的话,就让左边的孩子糖果数+1,如果是持平就不变,但是一定是要从右边开始遍历,因为需要从右边开始累加。

2024-04-02 18:29:02 405

原创 代码随想录 Day32 贪心算法 122.买卖股票的最佳时机II 55. 跳跃游戏 45.跳跃游戏II

1. 本题的思路受到上一道题目的影响,所以说认为需要进行波峰波谷的判断进行处理,实际上本题不需要细分很多的场景,主打一个商业就是有钱就赚,赔钱不干。思路:一直在说贪心算法是没有套路的,但是能够总结为贪心算法也是有着共性的东西,当我们在解决贪心算法的时候,注意问题的简化思想才能更好的完成。1. 本题借助于前面一道题的思路之后,问题就简单了不少。就是需要考虑一些临界情况。2. 本题没有直接用cral直接代码,因为贪心算法问题需要有自己的思路。122.买卖股票的最佳时机II。122.买卖股票的最佳时机II。

2024-04-02 12:02:54 316

原创 代码随想录 Day31 贪心算法 理论基础 455.分发饼干 376. 摆动序列 53. 最大子序和

1. 对于相关元素初值的设置,坡度的变化我们设置一开始就设置result为1,因为我们假设在最前面或者是最后面有一段平坡这样一般情况里就包含了只有两个元素的情况,并且可以举例如果只有两个相平的元素的时候依然是可以满足的。1. 本题的思路是很难想的,一开始我以为想要出现一正一负的情况的话就需要,做乘法相乘等于负数但是没有想到平坡的问题。可能出现平坡后又同方向坡度变化的情况,可能出现平坡后又反方向坡度变化的情况。2. 贪心的两个极端:要么就是很简单的常识,要么就是很难理解的。就是通过局部最优搜索全局最优。

2024-04-01 22:53:30 387

原创 代码随想录 Day30 332.重新安排行程 51. N皇后 37. 解数独

如果说该层是可以的但是向下递归的时候下一层没有一个是可以的话,这个时候就会return false;2. 开始的时候就设置两个for循环,并没有像以前一样设置终止条件,也是因为只要是有一种符合的情况的话就可以,所以说设置为bool。2. 注意比较的时候是对于一个char类型的元素进行比较而不是一个int进行比较,需要注意输入以及输出的类型,还有就是加’‘。1. (i/3)*3和(i/3)*3+3是一个小的九宫格的范围,小的点不要忘记*3。思路:本题的思路是很有难度的,跟着卡哥的思想写确实就简单了很多。

2024-04-01 18:14:57 359

原创 代码随想录 Day29 回溯算法 491.递增子序列 46.全排列 47.全排列 II

回溯问题可以分为一般的回溯,向下可以分为组合或是排列问题,细分细节注意需要去重的情况。//组合问题if(终止条件){//在组合问题中,往往也会不使用终止条件以及return,而是只进行将一维数组放入到二维数组中去//因为当for循环的不断的执行,会超出数值的范围这个时候就不会再继续循环,并且也可以执行下一层i++){// 需要从startIndex开始,这样的话,之前的元素就不能被选中,就不会出现组合内重复的问题了//进行树的深度的加深//回溯的时候推出元素。

2024-04-01 11:01:11 538

原创 代码随想录 Day28 93.复原IP地址 78.子集 90.子集II

结合下图就可以理解,在取得前一个的相同元素的基础上,我们才可以再去取新的相同的元素,如果说并没有去前面那个相同的元素的话,取这个就必然会出现相同的情况。2. 在backtracking函数for循环中如果一个切割不行的话后面再加上一些数字也肯定不行,所以这个地方的处理都是在valid中,如果不是有效的话,就直接退出循环就可以了,而不是像其他题目的情况一样,需要continue考虑在加上一些字符可能成立的情况。1. 此处s[i]单个字符串s[i] - '0'可以转换为字符,如果是多个字符的话不行。

2024-03-31 20:18:34 328

空空如也

空空如也

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

TA关注的人

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