![](https://img-blog.csdnimg.cn/direct/5d8bdc60128e4bb5b675a1491b4ed73f.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
C++
文章平均质量分 82
C++学习
栖林_
一个励志于做全栈工程师的平平无奇大学生,希望在这里留下自己学习的记录
展开
-
C++智能指针详解
简单说其实,weak_ptr是可以从一个shared_ptr或者weak_ptr对象构造出来的,而他只有获得资源的观测权,并没有实际的共享资源,因此也没有增加引用计数,使用weak_ptr的use_count()成员还可以观测到资源的引用计数。这样做的本质其实是将这个资源托管给了对象,我们之前学类和对象的时候,他是可以自动调用构造和析构函数的,这就意味着我们不需要显示释放资源,并且可以让资源在其生命周期内始终有效,因为在调用析构的时候,才会释放资源。原创 2024-05-28 20:32:04 · 800 阅读 · 0 评论 -
C++异常处理机制
异常是是C++处理程序错误的一种方式,当程序发生错误的时候,就会抛出异常,这个异常可以是程序自发给出的,也有可能是我们手动写的throw,当抛出异常之后,我们可以在别的地方捕获异常,catch到就可以对异常进行提示和处理。需要注意的是,当抛出异常时,也就是执行到throw语句的时候,会直接跳出到catch的语句,throw后面的语句就不会被执行,如果抛出的异常没有被捕获,那么程序就会终止,显示未经处理的异常。catch:这个是捕获异常,当捕获到了这个异常(类)的时候,需要执行的语句。原创 2024-05-20 14:48:50 · 571 阅读 · 0 评论 -
C++11特性(三)
上面的参数args前面有省略号,表示一个可变参数模板,带省略号的参数我们称之为参数包,里面包含了有限多个参数,我们无法直接从参数包args中获取每个参数,只能通过递归的方式来打开这个包,一步步获取。但是有人要说了,那万一我要用全局的变量呢,之前我们讲过,一对大括号其实就是一个小环境,那么这个小环境里面是不能随便用外面的变量的,因为函数和类本身的设计还是需要高内聚低耦合的。在原先的模板中,我们只能接受一定数量的模板参数,在可变参数模板这里比较抽象,使用也有一定技巧,需要在实践中才能真正理解。原创 2024-05-16 20:53:54 · 1000 阅读 · 0 评论 -
C++11特性(二)
这里的临时对象其实就很多余,这时我们可以写一个右值引用的拷贝构造,因为编译器会调用最合适的那个,他就会调用这个我们写的交换的逻辑,而不是那个逐一拷贝的深拷贝了。左值表示的是一个数据的表达式,比如说变量的名字,或者是解引用的指针,我们可以获取左值的地址,并且可以对左值赋值,左值可以出现在赋值符号的左边,而右值不行。右值的本质上也是数据的表达式,但是与左值有不同,例如字面常量,表达式的返回值,函数的返回值(非左值引用返回),右值可以出现在赋值符号的右边,不能取地址。这些用法是我们可以容易理解的。原创 2024-05-14 20:47:16 · 259 阅读 · 0 评论 -
C++11特性(一)
C++11可以说是C语言演变成C++之后第二个重大的标准了,上一个重大的标准是C++98C++11相较于C++98带来了数量非常非常多的变化,新特性,对C++03进行了很多修正,甚至让C++11变得很不“C++”但是C++11能更好的用于系统开发和库开发,语法也更进一步泛化,简单化,稳定,安全这里介绍一些比较实用的语法特性。原创 2024-05-12 23:44:19 · 579 阅读 · 0 评论 -
哈希应用之布隆过滤器及其实现
这也就是为什么我们称之为过滤器,简单说一种应用就是用户注册时不允许重复名称,当我们查询时,发现不存在,这时就不需要再额外消耗资源去数据库中进行对比了,直接就可以确认,而当布隆过滤器发现,他是有可能存在的时候,再到数据库中对比,如果真的存在,再说不允许重复名称即可,这样就能节省大量的服务器资源,还能提高查询效率。但是这种存在依旧是“不可靠”的,在数据量特别巨大的时候,可能是别的字符串,恰好占用了这两个地址,此时就会误判,但是判断不存在的时候就是可靠的了,因为只要有一个是0,就说明这个字符串并不存在。原创 2024-05-02 18:07:45 · 400 阅读 · 0 评论 -
哈希应用之位图及其实现
第二种思路是使用两个普通位图,第一个位图来表示第一位,第二个位图来表示第二位,这样每次判断的时候虽然要将两个位图结合起来用,但是好在有我们刚刚实现的,也可以直接用库里面的。一个位置是x的位置想要置1的话,就说明不管原来是什么,置1之后结果一定是一,符合这个条件的位运算就是给这一位按位或1,那么同理的,后面分别就是按位与0,按位与1。假设是x,那么x/32,就是对应的第几个int,这里对应的是下标,就是从0开始的,x%32对应的是int的第几个位置了。排序加二分是NlogN的,哈希的话会好很多,是常数级的。原创 2024-04-30 18:38:20 · 278 阅读 · 0 评论 -
哈希封装unordered系列关联式容器
这里实现++主要有一个难点,就是当一个哈希桶走完的时候,我们如何找到下一个有效的哈希桶,一种思路是当场直接计算,取到下一个表中的值,计算出对应的哈希地址,第二种是直接现场推演,只要没有走出整个表,当我们找到一个不为空的节点时,这就是++的下一个位置,如果一直走出了表,就说明到了结尾,赋值为空即可。我们知道了这个错误的产生原因,就有思路可以解决了,就是不让他自动构造,我们手动构造一个迭代器给她返回就没问题了,也就是使用auto接收插入的返回值,然后再手动构造一个const迭代器,返回,就解决了这里的报错。原创 2024-04-24 23:10:42 · 538 阅读 · 0 评论 -
unordered系列关联式容器和开散列与闭散列的模拟实现
对于插入函数,也需要检测一下是否需要扩容,这里扩容的操作也可以像闭散列一样,逐一插入再交换,但其实没有必要这样做,单链表本身其实非常灵活,我们可以直接移动节点而非创造和删除节点,扩容之后的插入因为不知道查询的顺序,所以头插和尾插都是可以的,但是尾插需要找到尾部,效率其实没有那么高,因此我们选择头插。最上面的仿函数和之前红黑树实现的类似,红黑树里的仿函数是取出Key对应的T,这里的仿函数是因为不知道Key的类型,例如字符串,不能直接对某个数字取模,因此采用仿函数的方法进行特化。原创 2024-04-19 15:24:03 · 389 阅读 · 0 评论 -
红黑树封装map和set
cur就是根,我们已经访问完了根,想要找他的下一个节点,那根的下一个就是右子树最左节点,如此往复,一直到没有右子树了,接下来寻找的孩子是父亲左的第一个节点,这句话实际上就保证了左子树全部被访问了,因此孩子是父亲左的第一个节点就是下一个cur,也就是根,接下来就需要继续访问右子树了。第一个例子是,1的下一个节点是6,8的下一个节点是11,17的下一个节点是22,那我们其实就发现,cur的右子树存在,直接走到他的右子树的最左节点即可,那么如果他的右节点不存在呢。原创 2024-04-12 23:40:44 · 579 阅读 · 0 评论 -
C++手撕红黑树
我们定义颜色时,使用枚举类型,可以方便且明了的看到颜色除此之外我们默认插入节点是红色的,因为一旦插入节点是黑色,就会违反第四条规则,如果要满足的话,就要走到每一条路径上插入对应的黑色节点,代价巨大当插入节点是红色时,有可能会违反第三条规则,但是我们可以通过变色,旋转等操作在局部进行改变,这样就能使之仍然满足条件。原创 2024-04-08 18:17:33 · 1279 阅读 · 0 评论 -
C++手撕AVL树
之前我们讲了二叉搜索树的相关内容,但是也了解到二叉搜索树有其自身的缺陷,就是当插入的元素有序或者接近有序,退化成单支树的时候,他的时间复杂度就会退化成O(N),因此我们需要对他进行优化,有两种,一种是AVL树,也就是平衡二叉树,另一种是红黑树,这里我们先介绍AVL树。具体操作是将30的右子树给60的左子树,然后让30做60的父节点,之后更新平衡因子,这里有几点需要考虑,30的右子树有可能不存在,但是不影响结果。当新插入的节点在较高左子树的右侧时,旋转一次就无法解决问题了,此时就需要先左旋,再右选,如图。原创 2024-03-26 21:38:33 · 504 阅读 · 0 评论 -
map和set的介绍和使用
set的文档set直接翻译成中文是集合,而他与数学意义上的集合也有不同的地方,set是要求有序的,其次set中的元素不能被修改,元素是const的,但是允许插入删除set的有序是可以自行定义升序或者降序的,默认是按照小于排序(升序),不允许重复值set容器通过key访问单个元素的速度比unordered_set慢,但是都允许根据顺序对子集直接迭代set在底层是使用二叉搜索树的红黑树实现的。原创 2024-03-13 21:33:14 · 862 阅读 · 0 评论 -
C++泛型实现搜索二叉树
因此当二叉树为单支树,我们应当如何改进,使其性能都达到最优,就需要引入AVL树和红黑树,这些我们在后面也会陆续讲解和实现。第一类是K模型,结构中只需要存储Key即可,关键之就是所需要的值,一般用于检测某个值是否存在。二叉搜索树(BST,Binary Search Tree)又称为二叉排序树,空树也算。从根节点开始查找比较,比根大向右查找,比根小向左查找。最优情况下,二叉树为完全二叉树,其平均比较次数为。最差情况下,二叉树为单支树,其平均比较次数为。插入的次序不同,会影响到二叉树的结构。原创 2024-03-08 22:13:18 · 641 阅读 · 0 评论 -
C++多态详解
多态是在不同的为继承关系的类对象,调用同一个函数(同名函数),产生的不同的行为例如,Student是Person的子类,同样的买票动作下,Person是全价,而Student是全价。原创 2024-03-05 21:24:25 · 993 阅读 · 0 评论 -
C++继承详解
详细说明C++继承的相关内容原创 2024-03-02 13:57:36 · 544 阅读 · 0 评论 -
C++模板进阶
因为头文件不参与编译,不会对Add函数模板实例化,不会生成具体的加法函数,也就不存在所谓的函数地址,因此在obj文件链接时,main函数调用Add时寻找地址时找不到结果,因此链接时报错。模板特化之前,需要有一个基础的函数模板,在template之后加一个空的尖括号,在函数名之后加一对尖括号,其中放入需要特化的类型。模板特化可以解决一些,对于特殊类型的特殊模板化处理的问题,如果不采取这样的方式,就有可能会导致错误的结果。优点:提高了代码的复用性,节省资源,可以更快的迭代开发,例如STL,增强了代码的灵活性。原创 2024-02-23 19:03:48 · 545 阅读 · 0 评论 -
STL中优先队列的模拟实现与仿函数的介绍
我们单单从cout这一句来看,ls就好像一个函数一样,可以比较1和2的大小,但是实际上是由Less创建的一个对象来比较的。例如当堆中的数据为自定义类型,通用的less和greater比较就不起作用了,需要自行定义传入了。讲到这我们就明白了,这个仿函数实际上的功能类似于函数指针,是用来传递函数的逻辑的。这里我们发现他传入的用于比较的东西竟然是一个类模板,而不是我们所见到的函数。这里我们创建了一个Less类,并且重载了圆括号,让他比较x原创 2023-12-23 18:09:11 · 435 阅读 · 0 评论 -
STL中优先队列(堆)的详解
这个priority_queue翻译成中文就是优先级队列,但其实我们很难去一眼看出他的意思到底是什么,他的逻辑结构实际上类似于数据结构中的堆(heap),而且是大根堆,即为堆顶为序列的最大值我们了解了堆的基本内容之后再回到优先队列,我们已经知道了他的本质就是一个堆,再来理解就会相当简单。原创 2023-12-22 17:37:18 · 629 阅读 · 1 评论 -
STL中stack与queue详解
在学习和实现完vector,list等容器之后,stack和queue实际上也比较容易去实现对于这两个容器来说,他们与vector和list有着本质上的区别,因为vector和list实际上是基础的容器,分别对应着顺序表和链表这两个基础的逻辑结构,而对于stack和queue来说,他们可以理解为拥有特定性质的基础容器,可以暂且理解为相对高级的容器这一点我们可以从他们的模板类声明中得到验证我们可以看到,他们对模板的声明不同。原创 2023-12-21 18:45:57 · 764 阅读 · 0 评论 -
C++类和对象
/注意分号class为定义类的关键字,ClassName是类的名字,{}是类的主体,之中是类的成员,包括成员变量和成员函数声明和定义全都在类中定义,成员函数可能会被当成内联函数处理public:public:char* _sex;int _age;类声明在头文件中,成员函数放在源文件中,成员函数需要加类名public:public:char* _sex;int _age;原创 2023-12-18 18:15:49 · 850 阅读 · 0 评论 -
STL中list的介绍
list是一个类似于的序列式容器,是一个可以在常数时间范围内任意位置进行插入删除的容器。list与forward_list十分相似,但是forward_list本质上是一个单链表,因此也更简单高效。list不支持随机访问,需要通过从头部或者尾部迭代到该位置,其次list的每个节点不仅仅只有数据内容,还包含了指向前后位置的关联信息。原创 2023-12-13 19:22:02 · 374 阅读 · 0 评论 -
vector的简单模拟实现
C++中vector的简单模拟实现原创 2023-12-12 19:02:39 · 312 阅读 · 0 评论 -
STL中vector的介绍
vector是一个可变大小数组的序列容器,是一个类似于数组的顺序存储结构容器,因此可以采用下表对vector的元素进行访问,可以进行随机存储,而且其大小是可变的。原创 2023-12-09 14:28:46 · 361 阅读 · 0 评论 -
C++中string类的模拟实现
C++中string类的模拟实现原创 2023-12-08 14:38:24 · 394 阅读 · 0 评论 -
类和对象(5)(完结撒花)
static成员,匿名对象等的介绍原创 2023-08-31 15:38:26 · 102 阅读 · 1 评论 -
类和对象(4)
const成员函数的介绍原创 2023-08-29 00:08:58 · 78 阅读 · 3 评论 -
类和对象(3)
拷贝构造函数和运算符重载原创 2023-08-11 20:23:26 · 63 阅读 · 1 评论 -
STL与string的介绍
string类是C++中的一个容器,对应的是C语言的字符串,而C语言对字符串的处理是使用字符数组的方法,相对来说比较繁琐和相对不安全,由此在C++引出了string类。原创 2023-12-06 15:30:25 · 390 阅读 · 1 评论 -
C++模板介绍
c++模板原创 2023-09-05 12:03:04 · 55 阅读 · 0 评论 -
C++内存管理
c++内存管理原创 2023-09-01 20:44:53 · 47 阅读 · 1 评论 -
类和对象(2)
this指针构造和析构函数的介绍原创 2023-08-03 21:41:47 · 105 阅读 · 1 评论 -
类和对象(1)
C++类和对象的介绍原创 2023-07-29 17:13:05 · 154 阅读 · 3 评论 -
C++入门
C++的基本入门介绍原创 2023-07-25 16:00:06 · 127 阅读 · 3 评论