C++
文章平均质量分 90
骄傲的少年磊磊
永远年轻 永远热泪盈眶
展开
-
一文彻底搞懂哈希!
文章目录1. unordered系列关联式容器1.1 unordered_map1.2 unordered_set2. 哈希底层结构2.1 哈希概念1. unordered系列关联式容器在C++98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到log2N,即最差情况下需要比较红黑树的高度次,当树中的节点非常多时,查询效率也不理想。最好的查询是,进行很少的比较次数就能够将元素找到,因此在C++11中,STL又提供了4个unordered系列的关联式容器,这四个容器与红黑树结构的关联原创 2021-02-06 21:05:58 · 1099 阅读 · 0 评论 -
红黑树模拟实现STL中的map与set(附详细代码)
文章目录1.红黑树的迭代器2.改造红黑树3.map的模拟实现4.set的模拟实现1.红黑树的迭代器迭代器的好处是可以方便遍历,使数据结构的底层实现与用户透明。如果想要给红黑树增加迭代器,需要考虑以下问题:begin()与end()STL明确规定,begin()与end()代表的是一段前闭后开的区间,而对红黑树进行中序遍历后,可以得到一个有序的序列,因此:begin()可以放在红黑树中最小节点(即最左侧节点)的位置,end()放在最大节点(最右侧节点)的下一个位置,关键是最大节点的下一个位置在哪块?能原创 2021-01-26 17:38:32 · 674 阅读 · 0 评论 -
图文详解红黑树
文章目录1.红黑树的概念2.红黑树的性质3.红黑树节点的定义4.红黑树的结构5.红黑树的插入操作6.红黑树的验证7.红黑树的删除8.红黑树与AVL树的比较1.红黑树的概念红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。结构如下图所示:2.红黑树的性质每个结点不是红色就是黑色;根节点是黑色的;如果一个节点是红色的,则它的两个孩子原创 2021-01-25 18:54:28 · 640 阅读 · 0 评论 -
图文详解AVL树
文章目录1.AVL树的概念2.AVL树节点的定义3.AVL树的插入4.AVL树的旋转4.1 右单旋4.2 左单旋4.3 先左单旋再右单旋4.4 先右单旋再左单旋5.AVL树的验证6.AVL树的性能1.AVL树的概念AVL树又称平衡二叉搜索树。二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。因此,两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年发明了一种解决上述问题的方法:当向二叉搜索树原创 2021-01-23 21:56:36 · 2396 阅读 · 4 评论 -
【C++】map和set
文章目录1.关联式容器2.键值对3. 树形结构的关联式容器3.1 set3.1.1 set的介绍3.1.2 set的使用3.2 map3.2.1 map的介绍3.2.2 map的使用3.3 multiset3.3.1 multiset的介绍3.3.2 multiset的使用3.4 multimap3.4.1 multimap的介绍3.4.2 multimap的使用1.关联式容器我们已经接触过STL中的部分容器,比如:vector、list、deque、forward_list(C++11)等,这些容器统原创 2021-01-22 17:27:30 · 911 阅读 · 0 评论 -
二叉搜索树知识点总结
文章目录一、 二叉搜索树概念二、二叉搜索树操作2.1 查找2.2 插入2.3 删除2.4 验证三、 二叉搜索树的应用四、二叉搜索树的性能分析一、 二叉搜索树概念二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树例如:int a [] = {5,3,4,1,7,8,2,6,0,9};二、二叉搜索树操作2.1 查找N原创 2020-12-27 21:19:32 · 1131 阅读 · 0 评论 -
【C++】多态知识点大总结
文章目录一、多态的概念二、多态的定义和实现2.1 多态的构成条件2.2 虚函数2.3 虚函数的重写2.4 C++11 override 和 final2.5 重载、覆盖(重写)、隐藏(重定义)的对比三、抽象类3.1 概念3.2 接口继承和实现继承四、多态的原理4.1 虚表函数4.2 动态绑定与静态绑定五、单继承和多继承关系中的虚表函数5.1 单继承中的虚表函数5.2 多继承中的虚函数表一、多态的概念本篇文章代码及解释都是在vs2013下的x86程序中,涉及的指针都是4bytes。多态的概念:通俗来说原创 2020-12-15 11:25:44 · 863 阅读 · 0 评论 -
【C++】继承知识点大总结
文章目录一、继承的概念及定义1.1 继承的概念二、基类和派生类对象赋值转换三、继承中的作用域四、派生类的默认成员函数五、继承与友元六、继承与静态成员七、复杂的菱形继承及菱形虚拟继承八、继承的总结和反思一、继承的概念及定义1.1 继承的概念继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承原创 2020-12-12 08:48:51 · 946 阅读 · 0 评论 -
【C++】模板的特化
文章目录1、概念2、函数模板特化3、类模板特化3.1 全特化3.2 偏特化3.2.1 部分特化3.2.2 参数更进一步的限制3.3 类模板特化的应用---类型萃取1、概念通常情况下,使用模板可以实现一些与类型无关的代码,但对于一些特殊类型的可能会得到一些错误的结果,比如:template<class T>bool IsEqual(T& left,T& right){ return left == right;}void Test(){ char* p1 =原创 2020-11-18 12:01:55 · 989 阅读 · 0 评论 -
【C++】STL—容器适配器介绍
文章目录1、容器适配器1.1 什么是适配器1.2 STL标准库中stack和queue的底层结构1.3 deque的简单介绍2、stack的介绍和使用2.1 stack的介绍2.2 stack的使用2.3 stack的模拟实现3、queue的介绍和使用3.1 queue的介绍3.2 queue的使用3.3 queue的模拟实现4、priority_queue的介绍和使用4.1 priority_queue的介绍4.2 priority_queue的使用4.3 priority_queue的模拟实现1、容原创 2020-11-17 17:17:08 · 2404 阅读 · 0 评论 -
【C++】STL—容器—list介绍
文章目录1、list的概念2、list的使用2.1 list的构造2.2 list迭代器的使用2.3 list节点个数2.4 list元素访问2.5 list元素修改2.6 list迭代器失效3.list的模拟实现4.list和vector的区别1、list的概念list是带头结点的循环双向链表,是可以在常数范围内在任意位置进行插入和删除的序列式容器。2、list的使用list中的接口比较多,只需要掌握如何正确的使用,然后再去深入研究背后的原理,已达到可扩展的能力。以下为list中一些常见的重要接原创 2020-11-11 10:05:00 · 702 阅读 · 0 评论 -
【C++】STL—容器—vector介绍
文章目录一、vector的介绍1、概念2、分配空间策略3、特点二、vector的使用1、vector的定义2、vector iterator 的使用3、vector 空间增长4、vector 增删查改5、vector 迭代器失效问题三、vector的模拟实现一、vector的介绍1、概念vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它原创 2020-11-03 16:03:40 · 691 阅读 · 0 评论 -
【C++】一篇文章彻底搞懂浅拷贝和深拷贝
前言先抛出两者的概念:浅拷贝:也称位拷贝,编译器只是将对象中的值拷贝过来。如果对象中管理资源,最后就会导致多个对象共 享同一份资源,当一个对象销毁时就会将该资源释放掉,而此时另一些对象不知道该资源已经被释放,以为还有效,所以当继续对资源进项操作时,就会发生发生了访问违规。要解决浅拷贝问题,C++中引入了深拷贝。深拷贝:如果一个类中涉及到资源的管理,其拷贝构造函数、赋值运算符重载以及析构函数必须要显式给出。一般情况都是按照深拷贝方式提供。简单的来说,浅拷贝是增加了一个指针,指向原来已经存在的内存。而深原创 2020-11-02 17:05:28 · 746 阅读 · 0 评论 -
【C++】STL—容器—string类介绍
文章目录一、为什么要学习string类二、标准库中的string类2.1 string类2.2 string类的常用接口说明(常用)三、string类的模拟实现一、为什么要学习string类1、C语言中,字符串是以’\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP(面向对象编程)的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。2、在OJ中,有关字符串的题目基本以string类的形式出现,而且在常规工作中,原创 2020-11-01 22:05:55 · 729 阅读 · 0 评论 -
初识C++模板(函数、类模板)
文章目录一、泛型编程二、函数模板1.函数模板的概念2.函数模板格式3.函数模板原理4.函数模板的实例化5.模板参数的匹配原则三、类模板1.类模板的定义格式2.类模板的实例化一、泛型编程如何实现一个通用的加法函数呢?int Add(int left, int right){ return left + right;}double Add(double left, double right){ return left + right;}char Add(char left, char原创 2020-10-16 16:08:50 · 756 阅读 · 0 评论 -
C/C++中内存泄漏相关问题
文章目录1.什么是内存泄漏?2.内存泄漏的危害3.内存泄漏的分类4.如何检测内存泄漏?5.如何避免内存泄漏?1.什么是内存泄漏?内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。void MemoryLeaks(){ //1.内存申请了忘记释放 int* p1 = (int*)malloc(sizeof(int)); int* p2 = new int;原创 2020-10-15 10:16:13 · 777 阅读 · 0 评论 -
C++中动态内存管理(new/delete的实现)
1.复习C语言中动态内存管理:C语言动态内存管理2.C++内存管理方式C语言内存管理方式在C++中可以继续使用,但有些地方就无能为力而且使用起来比较麻烦,因此C++又提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理。new/delete代码演示:...原创 2020-10-14 16:07:39 · 980 阅读 · 0 评论 -
C语言及C++中static的总结
文章转自:C语言和c++中的static总结C语言中的staticstatic修饰全局变量,改变了变量的链接属性,使得这个全局变量只能在本文件中访问。static修饰局部变量,使其生命周期变长,只在该作用域中使用,离开该作用域。该变量没有被销毁,还在内存中,即使再一次访问,还是上一次变量的值,直到程序运行结束才释放,被static修饰的局部变量放在静态区存储区static修饰函数,改变了函数的链接属性,只能在本文件中调用,不能被其他文件访问 注意:静态变量可以多次赋值,但是只能初始化一次 static转载 2020-10-07 18:58:45 · 1440 阅读 · 0 评论 -
【C++】类与对象(中篇:类的六个默认成员函数)
文章目录1.类的六个默认成员函数2.构造函数3.析构函数4.拷贝构造函数5.赋值运算符重载6.const修饰类的成员函数7.取地址及const取地址操作符重载1.类的六个默认成员函数如果一个类中什么成员都没有,简称为空类。空类中什么都没有吗?并不是的,任何一个类在我们不写的情况下,都会自动生成下面6个默认成员函数。class Date{};2.构造函数2.1 概念构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,保证每个数据成员都有 一个合适的初始值,并且在对象原创 2020-08-21 15:28:00 · 1338 阅读 · 0 评论 -
【C++】类与对象(上篇:基础知识讲解)
文章目录1.面向过程和面向对象初步认识2.类的引入3.类的定义4.类的作用域5.类的实例化6.类的访问限定符及封装7.类对象大小的计算8.类成员函数的this指针1.面向过程和面向对象初步认识C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。例如:如何将大象装进冰箱?第一步:打开冰箱第二步:把大象塞进冰箱第三步:关上冰箱…C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。例如:把车开走。抽象两个对象:人和车。具体描述人与车原创 2020-08-04 16:51:09 · 1051 阅读 · 0 评论 -
【C++】auto关键字的使用(C++11)
1 auto简介C语言中auto关键字专门用来修饰函数中定义的变量,表明:该变量为自动存储类型的变量,即该变量会被自动销毁掉。C++11中,标准委员会赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。2 auto使用细则2.1 初始化int Add(int left, int right){ return left + right;}int main(){ auto a = 10;原创 2020-07-25 17:17:06 · 1650 阅读 · 2 评论 -
传值、传址、引用的介绍及各自的优缺点
1 传值1.1 概念void Swap(int left, int right){ int temp = left; left = right; right = temp;}int main(){ int a = 10; int b = 20; cout << a << " " << b << endl; Swap(a, b); cout << a << " " << b << end原创 2020-07-22 17:58:01 · 5000 阅读 · 2 评论 -
【C/C++】函数重载
1 前言自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重载了。举个栗子:以前有一个笑话,国有两个体育项目大家根本不用看,也不用担心。一个是乒乓球,一个是男足。前者是“谁也赢不了!”,后者是“谁也赢不了!”2 函数重载概念函数重载是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数或类型或顺序)必须不同,常用来处理实现功能类似数据类型不同的问题。总结:C++中,满足函数重载的条件是:多个函数作用域相同,函数名字原创 2020-07-21 18:12:08 · 1087 阅读 · 0 评论