![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 85
梦想很美
记录知识点
展开
-
C++11新特性
1.左值引用只能引用左值,不能引用右值。2.但是const左值引用既能引用左值也能引用右值。int main()//左值引用只能引用左值不能引用右值int a = 10;//ra1为a的别名//编译失败,因为10是右值//const左值引用既可以引用左值,也可以引用右值1.右值引用只能引用右值,不能引用左值2.但是右值引用可以引用move以后的左值int main()//右值引用只能引用右值,不能引用左值int a = 10;//无法将左值绑定到右值引用。原创 2024-03-15 10:08:45 · 636 阅读 · 0 评论 -
C++11智能指针
shared_ptr智能指针模拟实现重难点在于拷贝构造和拷贝赋值这两个函数。原创 2024-03-11 16:59:46 · 673 阅读 · 0 评论 -
位图和布隆过滤器
我们可以将原来一个位表示一个值,改为两个位表示一个值,如果出现两次及两次以上就用11来表示,如果只出现一次就用01表示,除此之外我们也可以设计一个类,类中成员为两个位图,通过两个位图来判断哪个数据出现一次,当n第一次出现时就把位图1第x位设为1,当第二次出现时,检查位图1中该数是否存在如果存在就把位图2也设为1。同问题1,我们把出现1次的数据在位图1和位图2中表示分别为0和1,出现两次在位图1和位图2中表示分别为1和0,出现两次以上在位图1和位图2中表示分别为1和1。将数字n对应的位置置为1。原创 2023-12-30 16:18:37 · 942 阅读 · 0 评论 -
C++哈希表(unordered_map和unordered_set)
哈希表封装unordered_map和unordered_set具体步骤一、哈希表类1.定义桶节点,桶节点中包含存储的值和指向下一个桶节点的指针2.定义哈希表类,类中成员变量分别为一个数组,数组中的值指向一个桶的节点指针3.各类成员函数实现,通过两个DefaultHashFunc函数来获取key值所对应的整型值二、迭代器1.迭代器类需要两个成员变量分别为哈希表指针和桶节点指针2.实现迭代器的++,==和!=,指针,引用等操作。原创 2023-12-29 19:30:54 · 1238 阅读 · 0 评论 -
封装map和set
这个节点可能存的是关键字K,也可能是键值对结构节点成员变量存储的数据要怎么设计呢?是存储K,还是呢?不怕,我们有模板参数,我们只需要传递给该节点一个类型就可以了,如果是set我们就传递K对应类型就可以了,如果是map我们就传给他一个pair类型T _data;, _col(RED)//新节点默认为红色因此如果是map这里的_data实例化出的类型就是pair,如果是set它的类型就是K为什么新插入的节点默认设为红色?原创 2023-12-26 18:34:57 · 922 阅读 · 0 评论 -
map容器的基本使用
map和set容器,multimap和multiset是树形结构的关联式容器,这四种容器底层原理都是红黑树,容器中的元素是一个有序序列。原创 2023-12-24 14:02:16 · 1236 阅读 · 0 评论 -
set容器的基本使用
map和set容器,multimap和multiset是树形结构的关联式容器,这四种容器底层原理都是红黑树,容器中的元素是一个有序序列。原创 2023-12-23 16:49:19 · 930 阅读 · 0 评论 -
C++异常
我们在写程序的时候,难免会出现一些错误,但是对于C语言来说,我们处理错误的方式,过于粗暴,比如通过assert断言终端程序,或者把错误放到错误码中,显然他们是有缺陷的,不利于我们知道是那种错误,且放在错误码中的错误还需要我们自己去查找,因此在C++中推出了异常处理机制,try…尝试try捕捉一个异常,如果出现异常就去找匹配的catch,如果在当前函数没有找到匹配的catch,就继续向上寻找,直到找到匹配的catch,如果一直找到main函数还是没有找到匹配的catch就直接终止程序。原创 2023-12-23 16:48:39 · 405 阅读 · 0 评论 -
Linux多线程
我们以两个线程之间造成的死锁问题进行举例,例如线程A,B,此时线程A,B各分别拥有一个临界资源a, b,且对这两个临界资源我们都添加了锁来进行保护,然后线程A在执行过程中需要临界资源b,线程B在执行过程中需要临界资源a,在A去申请资源b的时候发现资源正在被线程B占用,因此线程A只能等待,直到线程B不再占用资源b,同理B也需要等到线程A不再占用资源a,但是线程A,B现在都不去释放他们所拥有的资源,造成线程A,B只能去等待的情况,我们称之为死锁。下面我们来学习一下互斥量的接口,创建,加锁,解锁,销毁等。原创 2023-12-22 17:01:40 · 1264 阅读 · 0 评论 -
红黑树底层原理
红黑树也是一种二叉搜索树,只不过给这棵树上的节点带上了颜色,但是已经有了AVL树为什么还要搞出红黑树这个东西呢?首先AVL树和红黑树是同一量级的,查找一个值事假复杂度相同,但AVL树而言,控制严格平衡需要付出很大的代价,在插入和删除时需要进行大量的旋转。原创 2023-11-27 17:44:50 · 168 阅读 · 0 评论 -
AVL树的底层实现
AVL树又称平衡二叉搜索树,相比与二叉搜索树多了平衡的概念,为什么要有平衡二叉搜索树呢?因为二叉搜索树可能会出现退化现象,导致左右子树高度相差较大,甚至退化成单链表的形式,因此我们提出了平衡二叉搜索树,可以有效地解决高度相差过大的情况,平衡二叉搜索树要求任意节点的左右子树高度相差不大于1.原创 2023-11-17 19:12:55 · 94 阅读 · 0 评论 -
搜索二叉树
搜索二叉树中另一个特点就是没有重复的值,如果插入的节点在该树中已经存在,那么就不会再进行插入,如果不存在那么就在树的叶子结点的null节点处,找到合适的位置进行插入。既有左孩子又有右孩子:两种解决方案(假定左子树比该节点小,右子树比该节点大),1.让左子树的最大节点代替该位置2.让右子树最小节点代替该位置。它的特点就是任意节点的左右子树,一个子树全都比该节点的值大,另一个子树全都比该节点的值要小。无孩子节点,只有左孩子,只有右孩子,左右孩子都有。只有左孩子节点:让左孩子节点代替该节点的位置即可。原创 2023-11-05 00:39:34 · 165 阅读 · 1 评论 -
C++适配器
底层就是把这个类重载了一个()运算符。在传这个参数时,我们可以自己实现一个仿函数去传,也可以使用库里面的。比如stack的push底层其实是通过调用deque的push_back()实现的,pop底层是通过调用deque的pop_back()实现的。对于queue的push底层是通过调用deque的push_front()实现的,pop是通过调用deque的1pop_front()实现的。这两个是库里面包含的两个仿函数,用于比较大小,去排序,值得注意的是这里的less指的是升序,而greater是指降序。原创 2023-11-04 01:57:04 · 140 阅读 · 1 评论 -
C++迭代器
迭代器有正向迭代器和反向迭代器两种,先来回顾一下正向迭代器,正向迭代器中begin()指向容器的第一个元素,end()指向容器的最后一个元素的下一个位置,而反向迭代器rbegin()指向最后一个元素,rend()指向第一个元素的前一个位置,接下来我们在list中通过正向迭代器改造出反向迭代器,首先我们要指明的是。迭代器本质上是指针,那么又是怎么做到返回的rbegin这个迭代器指针解引用时,值为容器的最后一个值而不是最后一个值的下一个值呢?此外重载的运算符++和–在底层对应的是正向迭代器的–和++原创 2023-11-02 21:35:18 · 105 阅读 · 0 评论 -
C++特殊类的设计
不管你将来是不是用这个实例对象,只要程序启动这个对象就被实例化出来,且全局始终只有这一个实例化对象。优点:简单缺点:可能会导致进程启动变慢,且如果有多个单例类对象实例,启动顺序不确定。如果这个单例对象在多线程高并发情况下频繁使用,性能要求较高,那么显然使用饿汉模式来避免资源竞争,提高响应速度更好。原创 2023-11-01 15:20:10 · 58 阅读 · 0 评论 -
C++多态
多态通俗来讲就是同一件事情,不同的人来做就会产生不同结果,例如学生,军人,儿童,成人等买票,不同的人买票的价格不同。多态是在不同继承关系的类对象,去调用同一函数产,生了不同的行为。比如Student继承了Person,Person对象买票全价,Student对象买票半价。因为只有基类的指针或引用既能指向父类又能指向子类,注意基类对象如果不强制转换是不可以赋给子类的对象,引用或指针的。原创 2023-09-12 09:35:33 · 170 阅读 · 1 评论 -
C++的list
节点类中存放的是数据,以及每一个节点的前后指针。注意这里的构造函数给的默认值为val = T(),给了一个匿名对象,如果是自定义类型,它就会调用对应的自定义类型的构造函数,当它为内置类型时也会调用它对应的构造函数,这里你可能会有疑问,内置类型不是没有默认构造函数吗?这是因为C++11对这里进行了特殊处理,内置类型也给了默认构造函数。初次看到这个迭代器类,你会感到很茫然,为什么要给三个模板参数,并且这三个模板参数,在学习后你发现这三个模板参数T都是相同的,不过是T,T*,T&,直接返回函数对应的这三个类型原创 2023-09-12 00:41:53 · 426 阅读 · 0 评论 -
C++继承
其它的继承可遵循public>protected>private取其中小的方式进行访问,比如基类中成员为protected,子类以public方式进行继承,那么在子类中该成员的访问限定符就为两者中小的那个protected。友元关系不能继承,也就是说基类友元不能访问子类私有和保护成员,友元函数是你父亲的朋友,别人不一定知道他是你的朋友,要想让别人知道是你的朋友,那么你就要去声明他。例如B,C都继承A,D继承B也继承C,那么就要在B,C类继承A的时候在类A名前加virtual。组合是一种has-a的关系。原创 2023-08-17 11:08:59 · 221 阅读 · 0 评论 -
C++的stack和queue+优先队列
适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口。原创 2023-08-14 20:37:44 · 701 阅读 · 0 评论 -
C++的vector
在对容器进行insert、resize、reserve、assign、push_back等操作时会导致_capacity发生变化,在容量发生变化时,可能会出现异地扩容,这就会导致原来的迭代器指向已经被释放的空间,从而导致程序崩溃。以上述程序为例,如果是在VS中只要是在删除操作后,迭代器就会失效,如果不给迭代器重新赋值,直接再次使用迭代器就会强制报错,而在Linux中不一定会报错,因为可能会误打误撞的让程序可以运行,结果也会正确。2.指定位置元素的删除操作----erase。使用迭代器进行初始化构造。原创 2023-08-06 18:34:20 · 184 阅读 · 0 评论 -
C++中string类的常用函数
引言:在C语言中对于字符串的一些操作,例如在字符串末尾增加字符,对字符串拷贝等,我们可以通过调用库中函数来完成这些操作,在C++中,我们把这些常规操作封装成了string类,可以通过类对象直接调用这些函数,使得更加符合了面向对象的思想。原创 2023-06-08 18:27:13 · 3712 阅读 · 1 评论 -
C++内存管理和模板
malloc只是开辟了一段Date这个对象大小的空间,并没有初始化,而通过new申请空间时它会自动调用这个对象的构造函数对它进行初始化,并且free也仅仅是释放这个对象的空间,如果成员变量中包含在堆上动态申请的空间例如栈,它并不会对栈进行释放,而delete会自动调用析构函数对成员变量中动态开辟的空间进行释放。原创 2023-05-25 16:30:46 · 656 阅读 · 3 评论 -
C++类和对象再探
首先我们要弄清楚类成员变量是在哪里定义和声明的public :_day = day;int _year;int _month;int _day;一个成员变量只能在一个地方定义,并且只能初始化一次,不可以对同一个变量重复定义,但是当这个变量定义好之后,我们可以对它重复赋值,例如int a = 5;a = 6;a = 7;那么上面的日期类中成员变量是在哪里定义和声明的呢?声明private :int _year;int _month;原创 2023-05-17 16:47:17 · 866 阅读 · 1 评论 -
C++的类
类的定义有两种方式,一种是定义和声明都放在类体中,另一种是声明和定义分离分别放在.h和.cpp中我们把结构体,类等放在头文件.h其中之一的目的就是为了方便我们去看,这个类的功能,那么当成员函数的声明与定义都放在头文件.h中时,未免就会造成头文件代码过多,不容易查看。此时我们就要让声明与定义分离,把成员函数的定义放到.cpp文件中,但是要加上类域,不然编译器就会分不清这个函数到底是普通函数还是成员函数。例如上述代码成员函数定义在.cpp文件中就要这样写:要指明类域且返回类型放在最前面。原创 2023-05-01 22:30:53 · 3261 阅读 · 0 评论 -
C++类的默认成员函数
无论何时只要类的对象被创建,就会执行构造函数。C++规定内置类型不做处理,自定义类型会去调用而它的默认构造。但是有些也会对内置类型做处理,但那只是编译器的个性化行为,C++并没有规定。构造函数怎么去定义呢?首先构造函数的取名就与其他函数不同,它的名字与类名相同,且不需要返回值,这里的不需要返回值是指他不需要加返回类型,void也不用加。什么时候自己写构造函数呢?如果类成员函数中有自定义类型就要去自己写构造函数,如果类成员全是自定义类型就可以选择不写。原创 2023-05-02 19:06:14 · 649 阅读 · 2 评论 -
C++入门
引用就是对一个变量进行取别名,类似于对一个人取外号,无论你是叫他大名还是外号,都是指他。例如张三的外号就是法外狂徒,那么张三身高一米九,同样法外狂徒的身高也是一米九,同理如果法外狂徒本来不近视现在近视了,那么张三也变近视了。意思就是说一个变量引用和这个变量是同一个东西,任何一个改变另一个也会随着改变。引用之后法外狂徒就只能是指张三,不能改变,让这个外号成为李四的。1.引用是一种类型:引用类型 用int类型举例它对应的引用类型就是int&2.引用必须初始化,在起这个外号时,就要确定这个外号是谁的,并且确定原创 2023-04-16 21:08:40 · 149 阅读 · 2 评论 -
C++ 命名空间namespace,缺省参数,引用,重载,引用与指针的区别
C++ 命名空间namespace,缺省参数,引用,重载,引用与指针的区别原创 2022-12-14 14:17:05 · 198 阅读 · 2 评论