![](https://img-blog.csdnimg.cn/20210725172920192.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
《C++知识总结》
文章平均质量分 71
对于C++代码的理解,以及对于STL相关容器的认知
小羊教你来编程
有山川草木,纵横纸上,虫鱼鸟兽,飞动毫端。水到渠成,风来帆速,廿四中书考不难。
展开
-
八大排序总结---- 数据结构 (图解法) 面试必会! ! !
八大排序总结目录:一.插入排序 (InsertSort)二.希尔排序 (ShellSort)三.选择排序 (SelectSort)四.堆排序 (HeapSort)五.冒泡排序 (BubbleSort)六.快速排序 (QuickSort)1.hoare法2.挖坑法3.前后指针法七.归并排序 (MergeSort)1.递归实现2.非递归实现八.计数排序 (CountSort)目录:一.插入排序 (InsertSort)二.希尔排序 (ShellSort)三.选择排序 (SelectSort.原创 2021-07-28 12:27:31 · 1424 阅读 · 15 评论 -
什么是位图?
理解位图目录:一.位图引入1.位图概念2.位图的实现原理(1)构建方式(2)存储方式3.代码实现4.应用场景目录:一.位图引入 面试题【腾讯】 : 给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。 可能我们大多数人了解到的位图都是看到了腾讯的这个面试题理解到的,下面我就读于位图进行详细的讲解.1.位图概念 位图就是一种直接定址的哈希,它的效率很高,只用O(1)就可以查到对应位置是0还是12.位图的实现原理(.原创 2021-05-28 15:41:55 · 1073 阅读 · 3 评论 -
开散列的实现--哈希冲突
哈希冲突-开散列目录:一.开散列概念二.开散列原理三.哈希迭代器实现四.功能接口实现1.构造函数2.iterator begin()3.iterator end()4.insert5.Capacity6.Find7.Erase五.模拟实现Map六.模拟实现Set目录:一.开散列概念二.开散列原理三.哈希迭代器实现四.功能接口实现1.构造函数2.iterator begin()3.iterator end()4.insert5.Capacity6.Find7.Erase五.模拟实现.原创 2021-05-27 18:51:07 · 165 阅读 · 8 评论 -
线性探测-闭散列
线性探测的实现目录:一.线性探测的概念二.线性探测原理三.功能性接口1.构造2.insert3.Capacity4.Swap5.find6.erase目录:一.线性探测的概念 我们在这里讲到的线性探测是解决哈希冲突中闭散列的一种方式 闭散列:也叫开放定址法,当发生哈希冲突时,如果哈希表未被装满,说明在哈希表中必然还有空位置,那么可以把key存放到冲突位置中的“下一个” 空位置中去。~线性探测:从发生冲突的位置开始,依次向后探测,直到寻找到下一个空位置为止。二.线性探测原理原创 2021-05-27 14:01:45 · 1893 阅读 · 5 评论 -
红黑树底层迭代器的实现
红黑树实现迭代器目录:一. 封装迭代器二.红黑树部分改变三.map的实现四.set的实现目录: 这篇博客是对于红黑树内部迭代器实现, 点击红黑树的具体代码 .一. 封装迭代器 对于红黑树迭代器的实现,我们就是要利用二叉树的指向来依次的遍历对应的节点来实现红黑树的迭代器,所存在的_header节点就是方便迭代器的实现 template<class V>struct RBTreeIterator{ //泛型创建对应的结构 typede原创 2021-05-26 23:42:05 · 253 阅读 · 1 评论 -
红黑树来实现map&set
红黑树实现map&set目录:目录:原创 2021-05-25 21:12:22 · 125 阅读 · 0 评论 -
教你轻松理解红黑树的实现及原理
轻松理解红黑树目录:一.红黑树的原理&性质二.红黑树的结构&节点封装1.结构理解2.节点封装三.红黑树的插入操作1.判断是否存在根节点2.将对应的节点挂到树上3.判断是否存在红色连续节点(1) 单链存在红色连续(2) 存在黑色uncle节点的红色连续(3) 左子树 和 左子树的右子树存在红色连续(4) 存在红色uncle节点的红色连续四.左旋&右旋1.左旋操作2.右旋操作五.获取_header对应的最左最右节点1.获取最左节点2.获取最右节点六.中序遍历打印值七.判断是否是红黑树.原创 2021-05-25 18:37:11 · 232 阅读 · 8 评论 -
AVL树-平衡二叉树
AVL树目录:一.概念&原理二.平衡因子三.定义四.AVL树的旋转1.新节点插入到较高左子树的左边-左左:右单旋2.新节点插入到较高右子树的右边-右右:左单旋3.新节点插入到较高左子树的右边-左右:先左单旋再右单旋4.新节点插入到较高右子树的左边-右左:先右单旋再左单旋五.概念总结六.验证AVL树目录:一.概念&原理在之前我们理解到了二叉搜索树,可是我们发现如果数据有序或者接近有序的时候,二叉搜索树会退化成单支树 AVL树就是平衡二叉树,只不过在二叉搜索树的基础上加了一个平原创 2021-05-16 17:49:10 · 194 阅读 · 6 评论 -
map & multimap 关联性容器-C++
map & multimap目录:一.map模板二.Member functions三.Capacity四.Element access五.Modifiers六.Operations七.iterator八.multimap目录:一.map模板map<char, int> m1;二.Member functionsstruct classcomp{ //改变默认的排序方式的函数 bool operator()(const char& lhs, const ch原创 2021-05-13 16:12:09 · 120 阅读 · 1 评论 -
set & multiset关联式容器 -C++
set & multiset目录:一.关联式容器二.键值对三.set1.set概念2.构造函数3.capacity4.Modifiers5.Operations6.iterator四.multiset五.原理总结目录:一.关联式容器 在我们接触过的STL容器中像:vector list deque 这种的统称为序列式容器,底层为线性序列的数据结构^ 关联式容器也用来存放数据,不过不同的是里面储存的是<key,value>结构的键值对,数据检索时的效率更高..原创 2021-05-13 14:58:41 · 160 阅读 · 12 评论 -
二叉搜索树--C++
搜索二叉树目录:一.概念二.接口声明三.接口实现&原理1.构造内部类2.查找函数3.拷贝函数4.插入函数5.删除函数6.析构函数7.利用中序遍历的方式进行打印四.性能分析目录:一.概念二叉搜索树又称为二叉排序树,或者是一个空树,必须满足以下特点:满足条件: 1.如果其中的左子树不为空,则左子树上所有的节点的值小于根节点的值 ^ 2.如果其中的右子树不为空,则右子树上所有的节点的值大于根节点的值 ^ 3.每个数据都是单一存在,不会重复 二.接口声明//1.原创 2021-05-11 15:12:35 · 1540 阅读 · 7 评论 -
继承和多态的相关面试题总结
继承&多态/面试题目录:一.继承相关面试题1.什么是菱形继承?菱形继承有什么问题?2.什么是菱形虚拟继承?如何解决数据冗余和二义性?3.继承和组合的区别?分别在什么时候应用?二.多态相关面试题1.什么是多态?2.什么是重载 / 重写(覆盖) / 重定义(隐藏) ?3.多态的实现原理?4.inline可以是虚函数吗?5.静态成员可以是虚函数吗?6.构造函数可以是虚函数吗?7.析构函数可以是虚函数吗?什么场景下是?8.对象访问普通函数快还是虚函数快?9.虚函数表在什么时候生成?存在于哪里?10.虚继承.原创 2021-05-10 15:03:28 · 311 阅读 · 1 评论 -
多态
C++ 多态目录:一.多态概念二.多态的定义/实现1.多态的构成条件2.虚函数的重写1)构成2)函数重写的两个例外:(1)协变(2)析构函数的重写3)C++11 final / override(1)final:修饰虚函数,表示该虚函数不能被继承(2)override:检查派生类中是否重写基类的某个虚函数,没有重写则会报错4)重载/覆盖/隐藏的对比三.抽象类1)概念2)通过代码理解四.多态的原理目录:一.多态概念多态其实我们可以理解为: 人们去动物园买票的时候,大家买的都是票,但是每个人的价格是不原创 2021-05-08 23:59:00 · 160 阅读 · 4 评论 -
继承
C++ 继承目录:一.继承概念二.继承定义1. 定义2.基类成员可访问方式三.基类和派生类对象赋值转换1.子类可以给父类直接赋值2.基类对象不能赋值给派生类3.基类的指针可以通过强制类型转换给派生类的指针四.继承的作用域1.在继承体系中基类和派生类都有着独立的作用域2.隐藏(重定义)3.如果是函数成员的隐藏,只需要函数名相同就可以构成隐藏五.派生类的默认成员函数1.构造函数2.拷贝构造函数3.operator=4.析构函数六.继承和有元七.继承和静态成员八.菱形继承/菱形虚拟继承1.概念2.数据冗余/二义.原创 2021-05-07 17:59:57 · 385 阅读 · 10 评论 -
利用Vector实现优先级队列
优先级队列template<class T,class Container=vector<T>>class PriorityQueue{private: vector<T> v;public: void shiftUp(int child){ int parent = (child - 1) / 2; //进行调整 while (child > 0){ if (v[parent] < v[child]){ .原创 2021-05-07 12:57:04 · 821 阅读 · 2 评论 -
通过List和Vector来实现栈和队列
栈/队列目录:一.实现栈(stack)1.Vector实现栈2.List实现栈二.实现队列(queue)1.List实现队列目录:一.实现栈(stack)1.Vector实现栈实现还是比较简单的,我们直接通过调用对应的迭代器来进行操作就可以了.class Stack1{ public: void push(const T& val){ _st.push_back(val); //直接调用vector的尾插操作 } void pop(){ _st.pop_.原创 2021-05-06 22:32:04 · 635 阅读 · 1 评论 -
Vector和List的差别
Vector/List目录:一.底层结构二.随机访问三.插入/删除四.空间利用率五.迭代器六.迭代器失效七.使用场景目录:一.底层结构Vector :是一段连续的空间,是一个 动态的顺序表List :是带有头结点的 双向循环链表二.随机访问Vector :支持随机访问,在访问某个元素的时候,元素的效率为 O(1)List :不支持随机访问,访问某个元素的效率是 O(n)三.插入/删除Vector :1.任意位置插入和删除效率比较低,需要搬移元素,时间复杂度为 .原创 2021-05-06 14:54:36 · 102 阅读 · 0 评论 -
Vector类相关OJ题目的理解
Vector类OJ题目目录:一.连续子数组的最大和二.电话号码的字母组合三.找出数组中出现次数超过一半的数字四.只出现一次的数iii五.目录:一.连续子数组的最大和框架:1.因为要求一个数组中的最大数值,我们想将每个数利用sum进行相加起来2.然后当sum的值res的时候,就进行交换就行了class Solution {public: int FindGreatestSumOfSubArray(vector<int> array) { //定义整型的vector容器原创 2021-05-06 13:14:26 · 201 阅读 · 0 评论 -
String类的相关OJ题目的理解
String类OJ题目目录:一.找出字符串中第一个只出现一次的字符二.两个字符串进行相乘三.翻转字符串中的单词四.翻转字符串的部分区间五.验证字符串是否回文六.字符串最后一个单词的长度七.找出字符串中只出现一次的字符八.翻转字符串九.字符串相加十.字符串转成整型数字目录:一.找出字符串中第一个只出现一次的字符框架:1.先定义一个字符串2.每个字符进行输入的时候进行+1操作3.在将最终只出现一次的字符进行输出int main(){ string s; //定义字符串 while (cin原创 2021-05-05 13:39:23 · 125 阅读 · 1 评论 -
stack的接口使用
stack接口使用目录:1.构造栈2.empty3.size4.top5.push6.pop目录:1.构造栈stack<int> st;stack<char> st2;2.empty----判断栈是否为空 while (!st.empty()){ //循环判断栈是否为空 cout << st.top() << " "; st.pop(); }3.size----查看栈中有多少个数据 cout << st.原创 2021-04-25 17:28:33 · 270 阅读 · 0 评论 -
怎样在list中实现迭代器的使用
list中使用迭代器目录:一.原因二.封装list迭代器三.函数内部对于迭代器的使用目录:一.原因因为list是一个双向带头循环链表,我们之前用的迭代器在这里是无法实现的,所以我们就要对这里的迭代器进行自定义的封装,才能达到对于迭代器的使用二.封装list迭代器template<class T>struct ListIterator{ ListIterator(ListNode<T>* node) //迭代器构造函数 :_node(node) {} //获.原创 2021-04-25 17:02:51 · 384 阅读 · 0 评论 -
实现一个简单地list类
实现简单的list原理:代码实现:原理:list的储存原理其实就是储存在一个双向带头循环链表,我们只要根据这个进行实现就可以了.代码实现:对于简单的list的实现=构造函数+析构函数+输入函数#include<string> using namespace std;template <class T> struct ListNode{ //这里是类的私有类的体现,我们简化类的private进行了封装 T _data; //存放的数据 ListNod.原创 2021-04-25 16:38:17 · 191 阅读 · 0 评论 -
list接口的详细使用及讲解
list接口介绍/使用目录:一.Member functions(函数创建)1.普通创建2.数字方式创建3.利用迭代器将string类初始化到list中4.普通数组传入list中5.vector类传入list中二.Iterators(迭代器的使用)1.正向迭代器2.只读迭代器3.反向迭代器4.范围for三.Modifiers(功能)四.Capacity(容量的查看)五.Operations1.splice2.remove3.unique4.sort5.merge目录:一.Member function.原创 2021-04-25 15:44:39 · 429 阅读 · 0 评论 -
怎样理解在C++11新出来的emplace函数 ? ?(干货 ! ! !)
C++11 emplace1.emplace2.emplace_back这是C++11新增的一个函数,其实和insert的利用有相似的地方,下面我们来做具体的解释1.emplace可以利用迭代器来自己控制要插入的位置struct A{ explicit A(int a, int b) //这里被explicit,故不能发生隐式类型转换 :_a(a) , _b(b) {} private: int _a; int _b; }; vector<A>v.原创 2021-03-31 16:15:44 · 517 阅读 · 1 评论 -
怎样vector内部的Modifiers(功能)进行实现 ?(详细 ! ! !)
vector5Modifiers(功能实现)1.assign1)通过输入对应元素来改变2) 通过迭代器来改变2.push_back3.pop_back4.insert1)插入单个字符2)插入多个3)插入对应范围内的字符串5.erase1)删除对应位置的字符2)删除范围内的字符串Modifiers(功能实现)这里主要涉及的就是对于单个元素的操作,主要理解和熟练使用这些操作的作用.1.assign1)通过输入对应元素来改变用来改变对应vector内部的空间元素值和空间内字节的大小 string.原创 2021-03-31 15:57:52 · 118 阅读 · 0 评论 -
怎样实现对vector类里面的元素进行访问???(干货 ! ! !)
vector4Element access(元素的访问)1.operator[ ]2.at3.dataElement access(元素的访问)我们在这里具体介绍三个主要的接口,剩下的大家主要用来自己编写,比较简单.1.operator[ ]主要就是利用operator[ ]将内部的值包含进来方便输出和改变其中的值.1)输出方式 string str = "1234567890"; vector<char>v(str.begin(), str.end()); for (si.原创 2021-03-31 14:34:55 · 960 阅读 · 0 评论 -
怎样使用vector的Capacity接口?(详细 ! ! ! !)
vector3Capacity(内存容量)1.size2.max_size3.resize4.capacity5.reserve6.shrink_to_fitCapacity(内存容量)1.size用来看内部有多少个字节struct A{ A(int a = 1, int b = 2) :_a(a) , _b(b) {} int _a = 1; int _b = 2; }; vector<char>v1; //变量的创建 vector<int.原创 2021-03-30 18:52:49 · 251 阅读 · 0 评论 -
怎样使用vector内部的迭代器?(干货 ! ! ! 详细 ! !)
vector2Iterators(迭代器)1.begin/end2.rbegin/rend3.cbegin/cend4.crbegin/crendIterators(迭代器)对于vector内部的迭代器其实就是一个可以指向vector首尾的一个接口,学会调用其接口就可以了.1.begin/endbegin是指向首元素位置end是指向最后一个元素后面的位置的数据 string str("1234567890"); //在上一篇博客中讲到关于vector的创建 vector<cha.原创 2021-03-30 18:14:11 · 344 阅读 · 0 评论 -
怎样简单的创建一个vector类?(干货 ! ! !详细 ! ! ! ! !)
Vector接口介绍一.Member functions(创建)1.建立空vector2.建立内置类型vector3.建立自定义类型vector4.数组方式建立(赋值)5.迭代器方式建立二.Iterators(迭代器)三.Capacity(内存容量)四.Element access(元素的访问)五.Modifiers(功能实现)一.Member functions(创建)1.建立空vector2.建立内置类型vector3.建立自定义类型vector4.数组方式建立(赋值)5.迭代器方式建立.原创 2021-03-30 16:42:25 · 3735 阅读 · 0 评论 -
自己来实现一个String类?干货!!!!详细!!!!(补充)
实现String类的补充一.insert1.插入字符2.插入字符串二.erase三.find1.寻找对应字符数的位置2.寻找对应的字符串的位置四.选取字符串中的子串五.赋值运符补充operator >>operator <<这里对于String类的具体补充是让我们更加完善这个接口,在上一篇博客中 点击此处就是一个简单的手撕String,这里是补充,让我们对于String类的理解更加的深刻.一.insert1.插入字符比较简单,就是要对于其后面的元素进行后移的操作,复杂度比较.原创 2021-03-28 15:50:56 · 311 阅读 · 0 评论 -
对于String 类相关接口的补充
Sting类接口的补充目录:1.修改操作erasereplaceswap2.字符串具体操作c_strfindrfindsubstrfind_first_not_of;find_first_of;find_last_not_of;find_last_of;目录:之前对于String类的接口介绍的还不够全,下面我对于String类的接口进行进一步的补充1.修改操作erase----是对于字符串的一个删除操作string& erase (size_t pos = 0, size_t len =原创 2021-03-25 21:49:15 · 64 阅读 · 0 评论 -
自己来实现一个String类?干货!!!!详细!!!!
实现String类1.迭代器获取对应元素2.构造函数3.赋值运算符1) =2) [ ]3) [ ]4) +=5) +=6) +=4.析构函数5.相关的操作功能的实现1)pushBack2)reserve3)resize4)append5)print6)String类与String类/字符串/单个字符相加对于如何来实现一个String类,大多数人都会觉得很难,这个时候就有人要问了:其实是很简单的,对于类这一部分的结构,都有着固定的结构,首先我们将一个简单的结构先敲出来,然后将就像在类的外部写函数一样,.原创 2021-03-24 00:12:23 · 244 阅读 · 0 评论 -
STL--string类--string类的了解--string类的常用接口实现--string类的6种初始化方式--常见构造--迭代器--string类对象的访问--容量操作--修改操作
String类目录string类的常用接口实现:一.string类的6种初始化方式1.创建空的string对象2.将括号内部的字符串进行复制3.通过内部的字符串创建一个对象4.通过一个字符串的部分内容来创建一个新的字符串对象5.获取你输入字符串的前几个形成新的字符串6.创建一个字符对象,看有几个括号内的字符7.常用的简单构造二.string类对象的常见构造1.const对象2.非const对象三.迭代器1.迭代器的特点:2.类型:正向迭代器反向迭代器只读反向迭代器四.string类对象的访问1)for循环+原创 2021-03-17 00:12:39 · 157 阅读 · 0 评论 -
C++--模板初阶--泛型编程--函数模板--类模板--实例化-隐式-显式
模板初阶目录引入/泛型编程1.函数模板概念格式原理实例化1)隐式实例化2)显式实例化匹配规则2.类模板例题理解类模板的实例化目录引入/泛型编程关于模板这个版块,用简单的话来说就是我们在平常的时候,就说两个数相加,我们就要写好多类型: 整型.字符型.double .float 等等…我们利用模板,就是只写一个统一的函数,可以将所有同类型的函数进行涵盖,从而减少重复代码的出现,提高我们的效率,也节省了空间.1.函数模板概念函数模板就相当于将所有的整型 .浮点,等…全部都组成一个家族,在进行参数化的时原创 2021-03-16 16:09:21 · 198 阅读 · 0 评论 -
C++--C/C++的内存管理--具体的内存分布--C++中动态内存管理--operator new/operator delete函数--具体封装的原理--内存池思想涉及--new的定位表达式-区分
C/C++的内存管理1.内存分布2.C中的动态内存管理malloc/calloc/realloc和free3.C++中的动态内存管理1)new/delete内置类型2)new/delete自定义类型4.operator new和operator delete函数1)详细内部实现2)类专属重载5.new/delete实现原理1)内置类型2)自定义类型6.定位new的表达式7.相关面试题1.内存分布在我们平时写的代码中,其实随随便便写的一个函数,在它的内部,每一行的代码都有可能储存在不同的位置,我们要主要理原创 2021-03-16 13:58:05 · 87 阅读 · 0 评论 -
剑指offer--C++--2-7-8-9-10--替换空格--斐波那契数列--跳台阶--变态跳台阶--矩阵覆盖
剑指offer目录:JZ-2-替换空格JZ-7-斐波那契数列JZ-8-跳台阶JZ-9-变态跳台阶JZ-10-矩阵覆盖概述:因为对于C++的知识还没有完善,一些东西还没有学习到,所以剑指是对学过的进行写的,等到后面C++逐渐的完善,我会把其余剩下的会补全!加油!目录:JZ-2-替换空格题目描述:请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。自我理解:对于替换空格这个就比较简单了,就是原创 2021-03-11 21:52:57 · 150 阅读 · 0 评论 -
C++--类与对象(下)--相关例题--累加天数--打印日期--日期差值--计算日期到天数的转换--求前N项和
C++相关例题累加天数打印对应的日期日期差值计算日期到天数的转换求前N项和累加天数要求:设计一个程序能计算一个日期加上若干天后是什么日期这个要求和我们之前在日期相关的例题里面实现过,大体一致的.1.判断是否是闰年2.对天数进行判断,大于当月则减去,并且月份+13.一直操作,直到要加的天数为0为止,输出日期#include<iostream> using namespace std; int main() { int n; while(cin>原创 2021-03-07 18:06:54 · 291 阅读 · 2 评论 -
C++--类与对象(下)--构造函数--static成员--C++初始化(new)--友元--内部类
C++类与对象下构造函数:1.构造函数体赋值2.初始化列表全缺省默认构造特点:例题:执行当前程序,看输出的是什么?3.explicit关键字static成员:1.概念2.特性C++初始化(new)友元:1.友元函数2.友元类构造函数:1.构造函数体赋值对于函数体的赋值,我们常见的都是在函数体内进行赋值.如下:class Date{ public: Date(int year,int month,int day){ _year=year; _month=month; //这就是比较经典原创 2021-03-07 00:16:36 · 287 阅读 · 0 评论 -
C++--类与对象(中)--const成员--取地址及const取地址操作符重载
C++类与对象中const成员const修饰类的成员函数取地址及const取地址操作符重载const成员const修饰类的成员函数利用const对成员函数进行修饰,就叫做const成员函数,实际修饰的是内部的隐含指针this,表示该成员函数不能对类的任何成员进行修改.形式:const this :const A constclass A{public: int setI(int i){ _i = i; //==非const成员函数中,可以调用const成员函数 getI()原创 2021-03-06 20:52:35 · 519 阅读 · 0 评论 -
C++--类与对象(中)--日期类代码的具体实现(详细解释)
日期类代码的实现接口实现:1.获取某年某天的天数2.全缺省构造函数3.日期 += 天数4.日期 + 天数5.日期 - 天数6.日期 -= 天数7.前置 ++8.后置 ++9.后置 --10.前置 --11.>运算符重载12.==运算符重载13.>=运算符重载14.<运算符重载15.<=运算符重载16.!=运算符重载27.日期-日期 返回天数基础结构,我们下面要实现的接口全都属于成员函数:class Date{public: //====实现的接口所处的位置privat原创 2021-03-06 20:09:44 · 330 阅读 · 0 评论