自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C++异常

实际中很多公式都会自定义自己的异常体系进行规范的异常管理.公司中的项目一般会进行模块划分,让不同的程序员或小组完成不同模块,如果不对抛异常这件事进行规范,那么负责最外层捕获异常的程序员就非常难受,因为它需要捕获大家抛出的各种类型的异常对象.因此实际中都会定义一套继承的规范体系,先定义一个最基础的异常类,所有人抛出的异常对象都必须是继承于该异常的派生类对象,因为异常语法规定可以用基类捕获抛出的派生类对象,因此最外层就只需要捕获基类就行了.如下图:public:, _id(id){}

2023-12-07 16:45:52 930

原创 C++11包装器

function是一种函数包装器,也叫适配器.它可以对可调用对象进行包装,C++中的function本质就是一个类模板.Ret:被包装的可调用对象的返回值类型.Args...:被包装的可调用对象的形参.包装器示例class Pluspublic:int main()//包装函数指针//包装防函数(函数对象)//包装lambda表达式//类的静态成员函数包装//类的非静态成员函数包装return 0;

2023-12-06 21:49:16 883

原创 C++11--lambda表达式

说明一下:编译器只需要保证每个lambda表达式底层对应类的类名不同即可,并不是每个编译器都会将lambda表达式底层对应的类名处理成<lambda_uuid>,入vs2013用的就是uuid,vs2022用的就不是.说明一下:实际当我们以[&]或[=]的方式捕获变量时,编译器也不一定把父作用域中的所有变量都捕捉,编译器可能只会对lambda表达式中用到的变量进行捕捉,没有必要把用不到的变量也捕捉过来,这个主要看编译器的具体实现.可以看到,就算是两个一模一样的lambda表达式,它们的类型都是不同的.

2023-12-06 16:53:06 960

原创 C++11--可变参数模板

/函数体模板参数Args前面是有省略号,代表它是一个可变模板参数,我们把带有省略号的参数称为参数包,参数包里面可以包含0到N(N>=0)个模板参数,而args则是一个函数型参参数包.模板参数包Args和函数形参参数包args的名字可以是任意指定的,并不是说必须交Args和argsint main()ShowList();return 0;但是我们无法直接获取参数包中的每个参数的个数,只能通过展开参数包的方式来获取,这是使用可变参数模板的一个主要特点,也是最大的难点.//错误示例。

2023-12-05 12:44:37 966

原创 C++11--类的新功能

上述代码中用一个右值去构造s2对象,但由于Person类中没有生成默认的移动构造,因此这里会调用Person的拷贝构造函数(拷贝构造既能接收做值也能接收右值).这时再Person的拷贝构造函数中会调用string的拷贝构造对name成员进行深拷贝.如果想要让Person类生成默认的移动构造函数,就必须将Person类中的拷贝构造,拷贝赋值和析构函数全部注释调,这时用右值去构造s2对象时就会调用Person默认生成的移动构造函数.

2023-12-03 19:26:38 966

原创 C++11--右值引用

这里的[]运算符的重载函数返回的是一个字符的引用,因为他需要支持外部对该位置的字符进行修改,所以必须采用左值引用返回.之所以说这里返回的时一个左值,时因为这个返回的字符时被存储起来的,时存储在string对象的_str对象中的,因此这个字符时可以被取到地址的.右值引用和万能引用的区别就是,右值引用需要确定类型.而万能引用时根据传入实参的类型进行推导的,如果传入的实参是一个左值,那么这里的型参t就是左值引用,如果传入的实参是一个右值,那么这里的型参t就是右值引用.

2023-12-03 15:59:32 1110

原创 C++11入门

在2003年C++标准委员会提交了一份技术勘误表(简称TC1).使得C++03这个名字取代了C++98成为C++11之前的最新C++标准名称.但由于C++03主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯的把这两个标准合并称为C++98/03标准.

2023-12-02 19:08:41 819

原创 布隆过滤器

假设布隆过滤器使用三个哈希函数进行映射,那么"张三:这个昵称被使用后位图中会有三个比特位会被设置成1,当有人有使用"李四"这个昵称时,就算前两个哈希函数计算出来的位置都产生冲突,但由于第三个哈希函数计算出来的比特位的值是0,此时系统会判定:"李四"这个昵称没有被使用.我们这里可以大概的估算一下,如果使用3个哈希函数,即k的值为3,ln2的值我们取0.7,那么m和n的关系大概是m=4*n,也就是布隆过滤器的长度因该是插入元素的4倍.其中k位哈希函数个数,m位布隆过滤器的长度,n位插入的元素个数,p为误判率.

2023-12-01 17:47:24 875

原创 bitset(位图)模拟实现

一个整形有32个比特位,因此N个位的位图就需要用到N/32个整形,但实际上我们所需的整型个数是N/32+1,因为所给非整型模板参数N的值可能并不是32的整数倍.位图中是否全部位都没有被设置,实际上就是位图中有位没设置了,因此none成员函数直接调用any成员函数,然后将返回值取反后在进行返回即可.获取位图中被设置的位的个数,也就是统计位图中1的个数,我们只需要依次统计每个整数二进制中1的个数,然后相加即可得到位图中1的个数.size成员函数用于获取位图中可以容纳的位的个数.reset成员函数用于清空位.

2023-12-01 15:45:32 910

原创 STL--位图的介绍与使用

给40亿不重复的无符号整形,每排过序.给一个无符号整数,如何快速判断一个数是否在这40亿个数中?将这一对数进行排序,然后通过二分查找的方法判断该数是否在这一堆数中.将这一堆数插入到unordered_set容器中,然后调用find函数判断该数是否在这一堆数中.单从方法上来看,这两种方法都是可以的,而且效率也不错,第一种方法的时间复杂度是O(NlogN),第二种方法的时间复杂度O(N).

2023-12-01 14:21:23 924

原创 哈希表-哈希桶的实现

为了避免出现这种极端的情况,当桶中的元素个数超过一定长度,有些地方就会选择将改桶中的单链表结构换成红黑树,比如在Java中比较新的版本中,当桶中的个数超过8时,就会将桶中的单链表结构换成红黑树结构,而当该桶中的数据个数减少到8时,又会将该桶中的红黑树结构换成单链表结构.这样一来,当我们在哈希表中查找元素的过程中,若当前位置的元素与待查找的元素不匹配,但当前位置的状态是EXIST或是DELETE,那么我们因该继续往后进行查找,而当我们插入元素的时候,可以将元素插入状态为EMPTY或是DELETE的位置.

2023-11-28 13:40:20 1469

原创 红黑树(c++)实现

我们这里直接实现K V模型的红黑树,为了方便后序的旋转操作,将红黑树的结点定义为三叉链结构,除此之外还新加入了一个成员变量,用于表示结点的颜色.RED,BLACK,_kv(kv),_col(RED){}为什么构造结点时,默认将结点的颜色设置为红色?当我们向红黑树插入结点时,若我们插入的是黑色结点,那么插入路径上黑色结点的数目就比其他路径上黑色结点数目多了一个,即破坏了红黑树的性质四,此时我们就需要对红黑树进行调整.

2023-11-24 17:48:02 994

原创 STL--AVL树

我们这里直接实现KV模型的AVL树,为了方便后续操作,这里将AVL树中的结点定义为三叉链结构,并在每个结点当中引入一个平衡因子(右子树高度-左子树的高度).此外,还需要编写一个新结点的构造函数,由于新构造结点的左右子树都为空,于是将新构造结点的平衡因子初始值设置为0即可.int _bf;,_kv(kv),_bf(0){}注意:给每个结点增加平衡因子并不是必须的,只是实现AVL树的一种方式,不引入平衡因子也可可以实现AVL树,只不过会麻烦一点.

2023-11-21 18:27:12 119

原创 SLT--set,map,multiset,multimap

set是按照一定次序存储元素的容器,使用set的迭代器遍历set中的元素,可以得到有序序列.set当中存储的元素的value都是唯一的,不可以重复,因此可以使用set进行去重.与map/multimap不同,map/multimap中存储的是真正的键值对<key,value>,set中只放value,但在底层实际存放的是由<value,value>构成的键值对,因此在set容器中插入元素时,只需要插入value即可,不需要构造键值对.

2023-11-17 17:01:06 94

原创 Linux进程控制

父进程调用fork函数之后,为了创建子进程,fork函数内部才会进行一系列操作,包括创建子进程的进程控制块,创建子进程的进程地址空间,创建子进程对于的页表等等.子进程创建完毕后,操作系统还需要将子进程的进程控制块添加到系统进程列表中,此时进程便创建完毕.当子进程被创建时,子进程和父进程的数据和代码时共享的,即父子进程的代码和数据通过页表映射到物理内存的同一块空间,只有当父进程或子进程需要修改数据的时候,才将父进程的数据在内存当中拷贝一份,然后进行修改.

2023-11-15 22:01:53 94

原创 二叉树的一些经典题目

1. 二叉树创建字符串。你需要采用前序遍历的方式,将一个二叉树转换成一个有括号和整数组成的字符串.空结点则用一对括号"()"表示.而且你需要省略所有不影响字符串于原始二叉树之间的一对一映射关系的括号对.示例:输出:"1(2()(4))(3)"思路:题目要求我们省略所有不影响字符串于原始二叉树之间的一对一映射关系的括号对,也就是保留必要的括号对.

2023-11-13 13:40:08 193

原创 二叉搜索树

待删除结点的左右子树均不为空,那么当我们在二叉搜索树当中找到该结点后,可以使用替换法进行删除,可以将待删除结点左子树当中最大值的结点,或是待删除结点右子树当中最小的结点代替删除结点被删除(下面都以后者为例),然后将待删除结点的值改为替代其被删除的结点的值即可,而替代被删除的结点,必然左右子树当中至少有一个为空树,因此删除该结点的方法与前面说到的情况一和情况二的方法相同.析构函数完成对象中二叉搜索树结点的释放,注意释放时采用后续释放,当二叉搜索树中的结点被释放完后,将对象当中指向二叉搜索树的指针及时置为空.

2023-11-05 15:36:52 200

原创 Linux进程概念

例如创建一个进程实际上就是先将该进程的代码和数据加载到内存,紧接着操作系统对该进程进行描述形成对应的PCB,并将这个PCB插入到该双链表当中,而退出一个进程实际上就是先将该进程的PCB从该双链表中删除,然后操作系统再将内存当中属于该进程的代码和数据进行释放或是置为无效,总的来说,操作系统对进程的管理实际上就变成了对该双链表的增删查改.

2023-10-31 19:58:28 184

原创 c++多态

必须通过基类的指针或者引用调用虚函数.被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写.在虚函数的后面加上=0,则个函数为纯虚函数.包含纯虚函数的类叫做抽象类(也叫接口类),抽象类不能实例化出对象.class Carpublic:int main()Car c;//抽象类不能实例化出对象return 0;

2023-10-29 20:33:28 173

原创 c++继承

继承机制是面向对象程序设计是代码可以复用的一种重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生的新类,称为派生类.继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程,以前我们接触的复用都是函数的复用,而继承便是程序设计层次的复用public:protected:string _name = "张三";

2023-10-20 21:54:55 73 1

原创 c++模板进阶

一个项目由若干个源文件共同实现,而每个原文件单独编译生成目标文件,最后将所有的目标文件链接起来生成单一的可执行文件的过程称为分离编译模式.模板复用了代码,节省资源,更快的迭代开发,c++的标准模板库(STL)因此而诞生.增强了代码灵活性.模板会导致代码膨胀问题,也会导致编译时间变长.出现模板编译错误时,错误信息非常凌乱,不易定位错误.

2023-10-15 17:33:34 65 1

原创 SLT--priority_queue的使用与模拟实现

优先级队列默认使用的十vector作为其底层的存储数据的容器,在vector上又使用了对算法将vector中的元素构造成堆的结构,因此priority_queue就是堆,所有需要使用到堆的位置,都可以考虑使用priority_queue.(默认下priority_queue建的是大堆).方法一:使用vector作为底层容器,构建大堆.方法二:使用vector作为底层容器,构建小堆.方法三:不指定底层容器和内部需要构建的堆结构.注意:此时默认使用的是vector作为底层容器,内部默认构建的是大堆.

2023-10-13 11:21:31 38

原创 初步认识操作系统

实际上我们完成任何一件事都需要经两个过程,首先是决定要不要做这件事或者是如何做这件事(决策),然后就是做这件事(执行).校长作为管理者来管理学生,校长实际上就是那个做决策的人,但校长做出的决策不需要自己来执行,而是让辅导员去执行,使用辅导员的主要工作就是执行管理者的决策,我们将它称为执行者.举例谈谈操作系统的管理,现在给出三个角色:学生,辅导员和校长,很明显,在这三个人中校长是管理者,学生是被管理者,那辅导员充当的是什么角色呢?简单的说,操作系统就是一款进行软硬件资源管理的软件.那操作系统究竟管理什么呢?

2023-09-25 11:40:04 133 1

原创 STL--(stack和queue的模拟实现)

stack和queue有一点需要注意的是,虽然stack和queue中也可以存放元素,但在STL中并没将起划分到容器的行列,而是将起称为容器适配器,这是因为stack和queue只是对其他容器进行包装,STL中stack和queue默认使用queue容器.在stack和queue的类模板声明中我们就可以看到,他们的模板参数有两个,第一个是stack和queue当中存储的元素类型,而另一个就是使用的容器类型,当我们不指定的情况下使用的是deque容器.

2023-09-20 13:31:26 60 1

原创 基本了解git的使用

我们在编写文档时,为了防止文档的丢失,更改失误,失误后能恢复到原来的版本,不得不复制出一个副本.例如:"报告-v1","报告-v2","报告-v3""报告-v1""报告-确定版""报告-最终版"".每个版本都有各自的内容,但我们最终只会有一份实验报告被我们使用.但在此之前的工作都需要这些不同版本的报告,于是复制副本,文件越来越多,导致版本的数量越来越多,我们自己都不记得自己都是修改了什么内容.文档如此同样我们写的代码也是如此.

2023-09-20 12:56:01 158 1

原创 STL--(stack和queue的使用)

stack是一种容器适配器,专门用在具有后进先出的环境中,只能从容器的一端进行元素的插入与提取操作.方法二:使用特定的适配器定义队列注意:如果没有为queue指定特定的容器,默认情况下使用deque.

2023-09-18 21:31:42 118

原创 Linux环境基础开发工具

yum是一个在Fedora,RedHat和CentOS中的前端软件包管理器,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,不需要繁琐的一次次下载安装.但是一个服务器同一时刻只允许一个yum进行安装,不能同一时刻安装多个软件.可以看出代码中只是\n和\r的区别,那么它们俩的运行结果的区别可大了,一个在屏幕上打印hello Linux,一个什么也不输出.该现象就证明了行缓冲区的存在.+指令]:在不退出vim的情况下,就可以执行Linux命令行的命令.

2023-09-16 19:52:17 141 1

原创 STL--list(模拟实现)

list的数据结构其实就是一个带头结点的双向循环列表.因此,我们若要实现list,实现需要实现一个结点类,其中结点需要有:数据,保存前一个地址的变量和保存后一个地址的变量.而对于该节点的成员函数,我们只需要实现一个构造函数,该节点的释放由list的析构函数来维护.

2023-09-09 10:49:06 121 1

原创 STL--list(使用)

list是可以在常数范围内任意位置进行插入和删除的序列容器,并且该容器可以前后双向迭代.list的底层是双链表结构,链表中每一个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素.list与forward_list非常相似,主要不同在于forward_list是单链表,只能向前迭代.与其他的序列容器相比(array,vector,deque),list通常在任意位置进行插入移除元素的效率更好.

2023-09-04 18:17:20 153 1

原创 STL--vector(模拟实现)

vector有三个私有成员变量_start,_finish和_endofstorage._start指向的是容器的第一个元素,_finish指向的是有效元素的下一个元素,_endofstorage指向的是开辟空间的最后面.

2023-09-03 22:17:11 48

原创 STL--vector(使用)

vector是表示可变大小数组的序列容器.vector就像数组一样,也采用连续存储空间来存储元素,也就意味着可以采用下标堆vector的元素进行访问.和数组一样,但是又不数组,他的大小是可以动态改变的而且他的大小会被容器自动处理.vector的本质使用动态分配数组来存储他的元素,当新的元素插入时,这个数组需要被重新分配大小.

2023-09-03 11:02:10 145

原创 c++STL---string(模拟实现)

构造函数设置为缺省参数,如不传参,则默认构造为空字符串.字符串的初始大小和容量均设置为传入的有效字符长度(不包含'\0')

2023-09-01 20:23:33 180 1

原创 c++STL详解--string类(使用)

string();//构造一个空字符串//生成一个和str相同的string//复制str中从字符位置pos开始并跨越len个字符的部分,如果len == npos则从pos开始复制整个str//复制s所指的字符系列//复制s所指的前n个字符//复制n个c。

2023-08-31 18:06:42 94

原创 Linux的权限

shell理解,Linux的权限理解以及修改权限的命令

2023-08-29 18:58:29 34 1

原创 Linux常见指令

cp指令用于复制文件目录,如果同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的文件或目录复制到此目录中.若同时指定多个文件或目录,而最后的目的地并非一个已经存在的目录,则会出现错误信息.-F在每个文件名后附上一个字符说明该文件的类型,"*"表示可执行的普通文件,"/"表示目录,"@"表示符号链接,"|"表示FIFOS,"="表示套接字。-a:详细输出所有信息,依次为内核,主机名,内核版本号,内核版本,硬件名,处理器类型,硬件平台类型,操作系统名称.

2023-08-27 16:41:57 55 1

原创 c++模板--函数和类

class 类模板名{ 类成员定义}//Vector 不是具体的类,是编译器根据被实例化的类型生成具体类型的模具public:,_size(0){}~Vector();//注意参数模板放在类外面定义时,需要加参数列表if(_Date)

2023-08-23 09:11:02 50

原创 c/c++内存管理

如果申请的是内置类型的空间,new和malloc,delete和free基本类似,不同的地方是new/delete申请和释放的是单个元素的空间,new[]和delete[]申请的是连续空间,而且new在申请内存失败时会抛出异常,malloc会返回NULL;注意:申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用new[]和delete[],注意搭配使用.使用方法上:malloc用法:参数传字节,返回值是void* ,new会面跟申请对象的类型,返回值是类型的指针.

2023-08-20 18:59:18 51 1

原创 初步理解类和对象

/类体:由成员函数和成员变量构成//和struct一样后面的分号不能省略class为定义类的关键字,classname为类的名字,{}中为类的主体,注意定义类结束时后面的分号不能省略.类体中的内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数.1.声明和定义全部放在类体中,注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理.//显示成员的基本信息int age;char sex;2.声明放在.h文件中,成员函数定义放在.cpp文件中,

2023-08-19 10:01:31 44

原创 c++入门

/ C语言没办法解决类似这样的命名冲突问题,所以C++提出了namespace来解决int main()return 0;// 编译后后报错:error C2365: “rand”: 重定义;以前的定义是“函数”int val;这里lzw是命名空间的名字我用我的名字的简写,一般在项目开发种是有项目的名称做命名空间的int a;int b;int c;int d;命名空间是可以嵌套的这里在N1的命名空间内嵌套了一个N2命名空间。

2023-08-14 18:33:51 52

原创 八种排序总结

希尔排序是对直接插入排序的优化.当gap>1时都时预排序,目的是让数组更接近与有序.当gap = 1时,数组已经接近有序的了,这样会很快.这样整体而言,可以达到优化的效果.希尔排序的时间复杂度不好计算,因为gap的取值方法有很多,导致很难去计算.稳定性:不稳定排序.空间复杂度:只开辟了三个临时遍历gap,end,temp.所以空间复杂度为o(1).直接选择排序的思想非常好理解,但是效很好,在实际中很少使用时间复杂度:o(n^2)空间复杂度:o(1)稳定性:不稳定。

2023-08-13 12:00:16 44

空空如也

空空如也

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

TA关注的人

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