C++
文章平均质量分 76
C++
皮蛋的小世界
这个作者很懒,什么都没留下…
展开
-
细说智能指针
在C++中内存的分配与释放都是手工操作的(分配内存用new,释放内存用delete),这种方式本身就很容易产生内存泄漏。因为人们在开发过程中需要内存时很自然的就用new分配一块,但这块内存什么时候释放就说不好了,有可能用完马上就释放,也有可能要等待一个周期才能释放等等。而且随着时间的推移,代码越来越大,需要被释放的内存被遗忘的可能性也就更大。原创 2024-01-15 19:39:54 · 871 阅读 · 0 评论 -
C++11 异常
在C++中,异常是程序在执行过程中遇到意外情况或错误时抛出的一种机制。当程序运行过程中发生异常,可以通过抛出异常、捕获异常和处理异常来改变程序的正常执行流程。原创 2024-01-14 21:48:50 · 391 阅读 · 0 评论 -
【C++11】Lambda 表达式
捕捉列表描述了上下文中那些数据可以被lambda使用,以及使用的方式传值还是传引用。通过上述例子可以看出,lambda表达式实际上可以理解为无名函数,该函数无法直接调。用,如果想要直接调用,可借助auto将其赋值给一个变量。原创 2024-01-14 12:41:53 · 405 阅读 · 0 评论 -
C++11 左右值引用、移动语义
右值也是一个表示数据的表达式,如:字面常量、表达式返回值,函数返回值(这个不能是左值引用返回)等等,右值可以出现在赋值符号的右边,但是不能出现出现在赋值符号的左边,右值不能取地址。右值引用就是对右值的引用,给右值取别名。右值又分为:纯右值(内置类型表达式的值),将亡值(自定义类型表达式的值)需要注意的是右值是不能取地址的,但是给右值取别名后,会导致右值被存储到特定位置,且可以取到该位置的地址,也就是说例如:不能取字面量10的地址,但是rr1引用后,可以对rr1取地址,也可以修改rr1。原创 2024-01-13 21:51:17 · 430 阅读 · 0 评论 -
C++11入门介绍
本质就是一个大括号括起来的列表,如果用auto关键字定义一个变量来接收一个大括号括起来的列表,然后以typeid(变量名).name()的方式查看该变量的类型,此时会发现该变量的类型就是initializer_list。原创 2024-01-13 19:24:12 · 398 阅读 · 0 评论 -
哈希应用之位图+布隆过滤器
在 C++ 中,std::bitset 是一个标准库提供的类模板,用于表示固定大小的位集合。std::bitset 类模板允许你以一种方便且高效的方式处理位(二进制位)的集合。它在编译时指定了位集合的大小,并提供了一系列位操作函数,如设置位、清除位、翻转位等。每个位都被映射为一个布尔值,可以被访问和操作。std::bitset 的大小是固定的,由模板参数决定。你需要在创建 std::bitset 对象时指定位集合的大小。原创 2024-01-11 15:47:02 · 377 阅读 · 0 评论 -
C++--哈希表--散列--冲突--哈希闭散列模拟实现
采用哈希同的方式来解决哈希碰撞时,哈希表中存放的数据是单链表的头节点,如上图所示。链表节点中,有键值对,还有下一个节点的指针。仍然使用闭散列中转换整形的仿函数。原创 2023-11-19 16:35:48 · 161 阅读 · 0 评论 -
详解c++---map和set的封装
前言通过之前的学习我们知道set容器中存储的数据是k,map容器中存储的数据是k和v,但是这两个容器底层都是通过红黑树来进行实现的,那根据我们正常的思维就是,红黑树分别给这两个容器来进行一个适配,也就是说给map实现一个kv版本的迭代器,给set实现一个k版本的迭代器,但是如果是这样实现的话肯定就十分的麻烦,会干很多相同的事情,而c++是有模板这个东西的那我们能不能通过模板使得两个容器虽然装的数据个数是不一样的,但是却可以通过一个模板的红黑树类来封装成map或者set呢?原创 2023-11-17 09:50:13 · 135 阅读 · 0 评论 -
【C++】-- 红黑树详解
一、红黑树概念1.概念也是一种二叉搜索树,在每个结点上增加一个存储位,来表示该节点的颜色,节点要么是红色要么是黑色。2.性质红黑树具有以下性质:(1)每个结点不是红色就是黑色(2)根节点是黑色的(3)没有连续的红色节点(4)每条路径上都包含相同数目的黑色节点。:全部由黑色节点构成:由一黑一红构成,且红色节点数量等于黑色节点数量。假设黑色节点有N个,长度为最长路径长度为2*。但是在红黑树中,不一定有最短路径和最长路径。二、红黑树定义1.红黑树节点定义。原创 2023-11-16 00:19:16 · 240 阅读 · 0 评论 -
【C++】AVL树的4中旋转调整
当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(-1、0、1),即可降低树的高度,从而减少平均搜索长度。由此,该树被称为AVL树,即两位科学家名字的第一个字母。原创 2023-11-08 23:07:23 · 290 阅读 · 1 评论 -
sort的第三个参数与priority_queue的第三个模板参数
在C++的标准库中,std::sort是一个用于对容器的元素进行排序的算法。它接受三个参数:1、需要排序的容器的起始迭代器(包含)。2、需要排序的容器的结束迭代器(不包含)。3、可选参数,用于指定排序时的或。第三个参数允许你自定义排序的方式。它可以是一个指向函数的指针,也可以是一个函数对象。这个比较函数或比较函数对象会在排序过程中被调用,用于决定相邻元素之间的顺序。比较函数或比较函数对象应该满足以下规则:如果第一个参数小于第二个参数,如果第一个参数大于等于第二个参数,使用库里面的排序类。原创 2023-11-02 00:15:26 · 210 阅读 · 0 评论 -
【C++】set和multiset
set 是 C++ STL 中提供的容器,set是数学上的集合,其具有唯一性,即每个元素只出现一次,而 multiset 则是可重复集合,两者的内部实现是一棵红黑树,它们支持的函数基本相同。set是按照一定次序存储元素的容器在set中,元素的value标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。原创 2023-11-01 09:22:09 · 683 阅读 · 0 评论 -
【C++】搜索二叉树
③该节点有两个孩子,找比它自己的左孩子大,比它自己的右孩子小的节点替换它(也就是拿它的左子树的最大节点或右子树的最小节点替换它),替换之后,该节点就只有一个孩子或没有孩子了,就变成①或②了。由于根节点的访问限定符是私有的,那么在main函数中要终须遍历一棵树时,就无法将二叉搜索树的对象根节点传给中序遍历,因为类外面访问不到私有成员。②该节点有一个孩子,就把该节点的孩子节点的链接给该节点的父亲,顶替自己的位置,①可以当成②的特殊情况。①该节点没有孩子,即该节点是叶子节点,删除节点后把父亲指向自己的指针置空。原创 2023-10-30 11:43:43 · 118 阅读 · 0 评论 -
C++中多态的原理【精华】
我们调试代码这个指针我们叫做虚函数表指针(v代表virtual,f代表function)。一个含有虚函数的类中都至少都有一个虚函数表指针,因为虚函数的地址要被放到虚函数表中,虚函数表也简称虚表,。,看看内部结构通过调试我们发现。原创 2023-10-20 01:12:54 · 302 阅读 · 0 评论 -
C++中多态的使用和建立条件
多态按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。原创 2023-10-19 17:51:20 · 134 阅读 · 0 评论 -
C++【继承】
父类对象不能赋值给子类对象,父类的指针可以通过强制类型转换赋值给子类的指针(子类指针在使用时可能会存在越界风险)。因为子类和父类的运算符,编译器默认给与了同一个名字,所以构成了隐藏,所以每次调用=这个赋值运算符都会一直调用子类,会造成循环,所以这里的赋值显式调用父类的。当一个类派生自公有的父类,父类的公有成员也是子类的公有成员,父类的保护成员也是子类的保护成员,父类的私有成员子类继承过去了,子类中能访问,就定义为protected。当一个类派生自保护父类时,父类的公有成员和保护成员将成为子类的保护成员。原创 2023-10-14 12:09:37 · 191 阅读 · 0 评论 -
谈谈C++中模板分离式编译出现的一些问题
一个程序由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式。原创 2023-10-12 10:24:25 · 74 阅读 · 0 评论 -
C++中优先级队列
比如定义元素越大优先级越高,那么每次出队,都是将当前队列中最大的那个元素出队。个人感觉这就是所谓“优先级”的定义。现在看优先级队列是不是就是“堆”了,如果最大的元素优先级最高,那么每次出队的就是当前队列中最大的元素,那么队列实际就相当于一个大根堆,每次将堆根节点元素弹出,重新维护大根堆,就可以实现一个优先级队列。原创 2023-09-26 12:16:12 · 86 阅读 · 0 评论 -
List的使用+【模拟实现】+小细节
List是带头结点的双向链表list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。原创 2023-09-03 21:00:05 · 55 阅读 · 0 评论 -
C++:vector讲解+模拟实现【深拷贝和迭代器失效问题】
vector代表数组的序列容器,其大小可以改变。也就是数据结构中能动态增容的顺序表原创 2023-08-12 16:59:48 · 776 阅读 · 0 评论 -
感受一下string类的实现
为了和标准库里的string类进行区分,所以我们创建一个命名空间,将我们自己写的string类放在里面。npos是size_t类型的,该值在字符串成员函数中用作 len(或 sublen)参数值时,表示 "直到字符串结束"。原创 2023-08-09 16:54:43 · 29 阅读 · 0 评论 -
【C++】 String类常用方法
字符串是表示字符序列的对象。字符串类是 basic_string 类模板的实例化,它使用 char(即字节)作为字符类型,并带有默认的 char_traits 和分配器类型(有关该模板的更多信息,请参见 basic_string)。原创 2023-08-01 23:12:59 · 187 阅读 · 0 评论 -
【C++】动态内存管理、模板
C语言内存管理方式在C++中可以继续使用,但有些地方就无能为力,比如说对于C++中的自定义类型,虽然使用上面的函数也可以申请空间,但是空间申请完成之后对象的初始化工作无法完成,也就是说构造函数不会被调用,我们知道构造函数的调用是编译器自己的行为,我们不能(不是绝对)也不需要显式调用,因此C++又提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理。原创 2023-08-01 20:04:19 · 38 阅读 · 0 评论 -
C++ Static成员
static 是 C/C++ 中很常用的修饰符,它被用来控制变量的存储方式和可见性。原创 2023-07-31 21:12:03 · 38 阅读 · 0 评论 -
【C++】友元函数、初始化列表
类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员。尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数原创 2023-07-29 16:39:34 · 36 阅读 · 0 评论 -
C++类与对象的引入【探究this指针和构造函数】
定义一个类需要使用关键字 class,然后指定类的名称,主体包含类的成员变量和成员函数。定义一个类,本质上是定义一个数据类型的蓝图(后面解释什么是蓝图),它定义了类的对象包括了什么,以及可以在这个对象上执行哪些操作。原创 2023-07-21 02:48:07 · 61 阅读 · 0 评论 -
C++中的引用【应用场景以及常引用的注意点】
引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。原创 2023-07-19 00:12:16 · 101 阅读 · 0 评论 -
【C++】命名空间注意点
需要弄清楚上面的问题,就需要知道命名空间的相关知识简单来说就是将同一作用域的变量、函数、类用一个自定义的空间名字区分。int x = 0;int val;全局变量、函数、类可以放在一个叫做zxy的空间,这个空间的名字由你决定。命名空间的写法:namespace+自定义的空间名字。原创 2023-07-17 23:04:17 · 33 阅读 · 0 评论