
C++
文章平均质量分 92
为快乐起舞
吾本布衣,出自荷兰,四周大山.箪瓢屡空,环堵萧然,不弊风日.吾好读书,滴水石穿,笨鸟先飞,求知不断,方能立足,不羡孔北海之座上客常满,但求吾辈架上书常在.涸辙遗鲋,暮成括,人而无志,与彼何殊.Self-studyComputer Science. 愿为open source 自效微力.天高地阔,欲往观之.
展开
-
【C++】---STL之用哈希桶模拟实现:unordered_set和unordered_map
将__HTIterator中的_node更改为HashTable指针类型之后,由于在特定的平台上,指针所占的空间是一定的(在Win32平台上是4字节,在64位平台上是8字节),这样可以通过编译。如果我们要用哈希桶对unordered_set和unordered_map进行封装的话,我们面临一个问题那就是 unordered_set传给哈希桶的是K,而unordered_map传给哈希桶的是pair,同样我们之前也遇到过set和map的封装,是用的红黑树。迭代器最重要的部分呢~原创 2024-09-03 16:00:29 · 1242 阅读 · 0 评论 -
【C++】---哈希算法
简单的说,就是运用->哈希思想,而形成的数据结构!就是找出各个数据对应的储存位置的转换公式!按照这种方法查找不用拿key多次比较,不用像链表2叉树等等那些数据结构进行多次比较才会查找到结果。因此查找的速度比较快。哈希冲突:就是说,不同的数据,通过哈希函数,来计算出它所对应的映射位置的时候,位置相同,就是哈希冲突!比如说这里的10001和11,%10之后,他们所得的值都是1,都应该放在下标为1的位置,这就是哈希冲突!引起哈希冲突的原因:哈希函数设计不合理。原创 2024-08-27 11:09:59 · 1683 阅读 · 0 评论 -
【C++】--- set和map的封装
把红黑树节点定义 由类模板// 这里的 T就是上层set/map第2个形参 传来的类型T _data;由于红黑树不知道上层传的是K还是pair,这是由上层传递的模板参数T决定的,上层是封装我的map和set。private:红黑树的迭代器的本质是对节点指针进行封装,所以迭代器中只有封装红黑树节点指针这一个成员变量。//成员变量。原创 2024-08-19 18:08:36 · 1008 阅读 · 0 评论 -
【C++】---红黑树详解
为什么我们看似亲近,却貌合神离?原创 2024-08-14 14:00:10 · 1220 阅读 · 0 评论 -
【C++】---AVL树详解
由于要实现AVL树的增删改查,所以定义AVL树的节点,就需要定义parent,否则插入节点时,不知道要链接到树里面哪个节点下面。// 结点int _bf;// 平衡因子// 构造函数,_kv(kv),_bf(0)public://构造函数AVLTree(){}return;原创 2024-08-10 19:01:23 · 1047 阅读 · 0 评论 -
【C++】--- STL之 set 和 map
multimap容器与map容器的底层实现一样,也都是平衡搜索树(红黑树),其次,multimap容器和map容器所提供的成员函数的接口都是基本一致的,这里也就不再列举了,multimap容器和map容器的区别与multiset容器和set容器的区别一样,multimap允许键值冗余,即。比如:现在要建立一个英汉互译的字典,那该字典中必然有英文单词与其对应的中文含义,而且,英文单词与其中文含义是一一对应的关系,即通过该应该单词,在词典中就可以找到与其对应的中文含义。是最常用的,也是最简洁的!原创 2024-05-30 23:03:59 · 1167 阅读 · 20 评论 -
【C++】---二叉搜索树
二叉搜索树又叫二叉排序数,它或者是空树,或者是具有以下性质的二叉树:比如说:这个数组都可以将它化为二叉搜索树总结:在左子树值比根小,右子树值比根大。 当树走中序遍历时,序列都是有序的。二叉搜索树 的 结构定义:二、二叉搜索树操作(非递归)1.二叉搜索树的查找 (非递归)利用二分查找的方法,借助我们去二叉搜索树中查找节点。查找的时间复杂度:最坏的情况,就是查找高度(h=logN)次,就可以判断一个值在不在节点里面。查找的思路:(2)中序遍历由于根节点_root是私有成员变量,如果在main函数原创 2024-05-29 22:42:02 · 1853 阅读 · 39 评论 -
【C++】---多态
1. 子类必须对父类的虚函数进行重写(重写,包括三同:返回值相同,函数名相同,参数列表相同。协变除外)2. 必须是父类的指针或者引用去调用虚函数,而且被调用的函数必须是虚函数。注意:如果不把析构函数都定义为虚函数的话,可能会发生内存泄漏!1、自己好好想为什么建议把析构函数定义虚函数,防止发生内存泄漏?因为如果所有的析构函数都定义为虚函数之后,它们所有的析构函数就会形成多态的关系,形成多态之后,就会达到我们的期望:delete的时候,子类对象调用子类的析构函数,父类对象要用父类的析构函数。原创 2024-05-22 22:58:10 · 1082 阅读 · 38 评论 -
【C++】---继承
继承机制是面向对象程序设计当中使代码复用的重要手段,它允许程序员,在保持原有类特性的基础上,进行拓展,增加功能,产生新的类,这个新的类就叫做:派生类。继承的出现,呈现出面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们所接触到的复用都是函数的复用,而继承的出现则是体现了:类设计层次的复用。// 基类public:protected:// 派生类:stuprotected:int stu_ID;// 派生类:teaprotected:int job_ID;原创 2024-05-08 22:04:56 · 1411 阅读 · 16 评论 -
【C++】---模板进阶
【优点】1. 模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生2. 增强了代码的灵活性【缺陷】1. 模板会导致代码膨胀问题,也会导致编译时间变长3. 出现模板编译错误时,错误信息非常凌乱,不易定位错误好了,今天的分享就到这里了我的主页还有其他文章,欢迎学习指点。关注我,让我们一起学习,一起成长吧!原创 2024-05-01 15:54:09 · 1130 阅读 · 10 评论 -
【C++】---STL容器适配器之priority_queue
(1)priority_queen是一种:优先级队列,是一种常见的容器适配器,默认情况下把最大的元素放在第1位。(2)它的底层是用堆实现的,默认情况下是大堆。可以随时插入元素,快速查找到队列中最大的元素。(3)优先级队列从特定容器的尾部弹出,称为优先级队列的顶部。(4) priority_queue的底层容器可以是任何标准容器的类模板,也可以是其他特定设计的容器类。empty( ):检测容器是否为空size( ):返回容器中有效元素个数front( ):返回容器中第一个元素的引用。原创 2024-04-28 22:17:50 · 1584 阅读 · 22 评论 -
【C++】---STL容器适配器之底层deque浅析
stack是一种后进先出的特殊线性数据结构,因此只要具有push_back()和pop_back()操作的线性结构,都可 以作为stack的底层容器,比如vector和list都可以;queue是先进先出的特殊线性数据结构,只要具有 push_back和pop_front操作的线性结构,都可以作为queue的底层容器,比如list。因此在实际中,需要线性结构时,大多数情况下优先考虑vector和list,deque的应用并不多,不适合大量的头部和中间插入删除,也不适合大量的随机访问。1、什么是deque?原创 2024-04-28 22:17:02 · 1200 阅读 · 7 评论 -
【C++】---STL容器适配器之queue
(3)底层容器可以是标准容器类模板之一,如可用vector、list可以作为底层容器类,也可以是其他专门设计的容器类,。(1)队列是一种容器适配器,容器适配器说白了,它的底层就是用一个标准的容器来封装实现的。专门用于在FIFO:先进先出,从容器的一端插入,一端删除。默认情况下,如果没有为queue实例化指定容器类,则使用标准容器deque。(2)队列作为容器适配器实现,queue提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列。关注我,让我们一起学习,一起成长吧!原创 2024-04-27 20:53:51 · 640 阅读 · 27 评论 -
【C++】---STL容器适配器之stack
(1)适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个 类的接口 转换成客户希望的另外一个接口。(2)举个例子:比如对于笔记本来说,电源额定电压是220V,而美国电压是110V,为了能在美国使用,必须要用变压器转换电压以匹配美国电压,那么这个变压器就是个适配器。为什么stack和queue不是容器?而叫做容器适配器???(3)虽然stack和queue中也可以存放元素,但在STL中并没有将其划分在容器的行列,而是将其称为容器适配器,原创 2024-04-27 19:58:43 · 1199 阅读 · 9 评论 -
【C++】---STL之list的模拟实现
的重载的时候,我们一定要想清楚到底是对它里面节点的值来判断相不相等,还是说来判断指向这个结点的迭代器指针相不相等。但是链表不一样,物理空间连续所以说我要把这个迭代器进行一个类的封装,然后在里面对他运算符重载(例如:++)我们就可以掌控这个迭代器的行为!对于T&,类模板实例化出两个类,一个是T&类,一个是const T&类,同理,T*也一样。下面这里就是构造了一个迭代器,因为它的返回类型是迭代器,你只要有节点的指针我就可以构造一个迭代器,(2)迭代器有两种,一种是普通迭代器,一种是const的迭代器。原创 2024-04-25 22:16:32 · 1095 阅读 · 13 评论 -
【C++】---STL之list详解
erase删除pos位置元素后,pos位置之后的元素会往前搬移,没有导致底层空间的改变,理论上讲迭代 器不应该会失效,但是:如果pos刚好是最后一个元素,删完之后pos刚好是end的位置,而end位置是 没有元素的,那么pos就失效了。因此删除list中任意位置上元素时,vs就认为该位置迭代器失效 了。我的主页还有其他文章,欢迎学习指点。关注我,让我们一起学习,一起成长吧!2、优点:可以在任意位置进行插入删除,插入删除的效率比较高。好了,今天的分享就到这里了。原创 2024-04-24 15:47:49 · 1138 阅读 · 29 评论 -
【C++】---STL之vector的模拟实现
当我们不写vector的拷贝构造函数,编译器会自动生成一份,但编译器生成的只能完成数据的浅拷贝,然而vector的三个成员变量都是迭代器,也就是指针T*,如果T是内置类型,那么就不会出现问题,2、然后再判断是否需要扩容,如果进行了扩容,那么就需要先保存要插入的pos位置到start之间的相对位置。2、然后再要删除位置的下一个位置定义一个指针,然后从这个指针到结尾的位置的数据依次往前挪动覆盖数据。(2)当resize的大小比原来大,说明空间不够,同时也说明容量可能不够,要判断是否需要申请容量。原创 2024-04-23 21:38:01 · 815 阅读 · 10 评论 -
【C++】---STL之vector详解
vector定义:表示可以动态改变大小的数组序列容器!( vector实际上就是一个顺序表vector的特点:(1)vector像数组一样拥有连续的储存空间来储存元素,因此可以通过下标访问来访问储存的元素。然而还有一点,它不像数组,那就是它可以动态改变其自身的大小,而数组是静态的,它改变其自身大小是容器对容量自动处理的。(2)vector的空间比实际上所需要储存的空间更大一点, vector的尾插尾删的效率更高一点,而在其他位置的插入删除效率相对较低一点,因为每次的插入删除都会挪动后面的数据。原创 2024-04-22 22:41:56 · 727 阅读 · 2 评论 -
【C++】---string的模拟
char要加&,如果不加,那么return就是传值返回,返回的是_str[i]的拷贝,即临时对象,而临时对象具有常性,不能被修改,只能读;string类里面有成员函数:(1)_ str:字符串内容(2)_ size:字符串大小(3)_ capacity:字符串容量、①_size < n <_capacity,无需增容,直接将_size到n位置置为val。,_size最大为申请字节数-1,_capacity最大也为申请字节数-1。②n >_capacity,需增容,并将_size到n位置置为val。原创 2024-03-21 21:27:48 · 1244 阅读 · 14 评论 -
【C++】---string的OJ题
这里要特别回顾一下getline()函数!第1个参数就是:cin第2个参数就是:cin输入内容的变量!直接利用库里面的refind()函数!原创 2024-03-11 22:27:38 · 1191 阅读 · 23 评论 -
【C++】---STL之string详解
什么是STL?STL(standard template libaray-标准模板库):是C++标准模版库C语言中,字符串是以’\0’结尾的一些字符的集合。string是表示字符串的字符串类该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。string在底层实际是:basic_string模板类的别名,typedef basic_string<char, char_traits, allocator> string;不能操作多字节或者变长字符的序列。原创 2024-03-11 20:18:23 · 1815 阅读 · 1 评论 -
【C++】---内存管理new和delete详解
(1)malloc/free是函数,new/delete是操作符(2)malloc申请的空间不会初始化,new可以初始化(3)malloc申请的空间需要手动计算并传递过去,而new只需要在后面跟上空间类型即可。(4)new不需要强转,而malloc需要(5)malloc申请空间之后需要判断是否申请失败,new不需要,但是new需要捕获异常(6)申请自定义类型对象时,malloc/free只会开辟空间,而。原创 2024-02-26 21:43:01 · 1498 阅读 · 23 评论 -
【C++】---static成员(附OJ题)
那么如何对它countA进行定义初始化呢?如果在类内初始化的话,那么会导致每个对象都包含该静态成员静态成员变量 必须在类外定义和初始化的原因:(1)声明不分配内存,只有定义才会分配内存,如果在类内定义静态成员变量的话,那么每个对象进行初始化时都要为静态变量分配一块空间,这样会导致重复定义。(2)静态成员和类处于同一级别普通成员和对象处于同一级别。类级别的成员,应先于类对象的存在而存在,且静态成员变量应被所有类对象共享,所以静态成员变量不能放在类内当对象初始化时才初始化。原创 2024-02-20 13:59:11 · 1277 阅读 · 25 评论 -
【C++】---类和对象(下)初始化列表、explicit、匿名对象、友元
class Apublic:// 构造一次,打印一次~A()// 析构函数int main()A a1(10);A();// 匿名函数 生命周期只在这一行!A a2;A(100);// 匿名函数 生命周期只在这一行!return 0;A无论是类还是全局函数,只要A被定义为B的友元,A就可以访问B的非公有成员。好了,今天的分享就到这里了我的主页还有其他文章,欢迎学习指点。关注我,让我们一起学习,一起成长吧!原创 2024-02-20 13:58:23 · 1008 阅读 · 3 评论 -
【C++】实现Date类的各种运算符重载
上一篇文章只实现了operator==操作符重载,由于运算符较多,该篇文章单独实现剩余所有的运算符重载。原创 2024-02-16 11:31:03 · 767 阅读 · 20 评论 -
【C++】---类和对象(中)默认成员函数 和 操作符重载
对于日期类对象,我们可能会忘记调用Init函数进行初始化,C++为了解决这个问题,引入构造函数进行初始化。int _month;int _day;d1.Print();return 0;原创 2024-02-16 11:20:52 · 869 阅读 · 8 评论 -
【C++】---类和对象(上)入门
什么是类的实例化?用 类 创建 对象 的过程!注意:对变量定义成功的标志:该变量在内存中开了空间class Date//private:public:int _year;//这里对变量只是声明!!!声明不开辟空间!int _month;//注意:对变量定义成功的标志:该变量在内存中开了空间int _day;//此处对类进行了定义!D1._year;//为啥不能访问?因为:_year没有定义。原创 2024-02-16 09:55:41 · 660 阅读 · 3 评论 -
【C++】---命名空间,缺省参数,函数重载,内联函数等
在C/C++中,变量,函数以及后面C++要学的:类都是大量存在的,这些变量函数和类都存在于全局作用域中,这样可能会导致很多冲突,也就是命名冲突。使用命名空间的目的就是对这些标志符也就是变量函数等名称进行本地化,以此来避免命名冲突或名字污染。于是namespace关键字就应运而生来针对解决这种问题。在定义一个新的命名空间的时候,使用关键字namespace加后面命名空间的名称,然后再接一对{}就可以了,{}里面就是命名空间的成员。缺省参数是声明或定义函数时为函数的参数指定一个缺省值。原创 2024-02-04 18:25:24 · 905 阅读 · 9 评论