C++
文章平均质量分 64
c++理论知识学习
慕白昂
这个作者很懒,什么都没留下…
展开
-
实现C++中的红黑树
实现C++中的红黑树RBTree.h#pragma once#include<iostream>using namespace std;enum Color { RED, BLACK };template<class T>struct RBTreeNode //红黑树节点{ RBTreeNode(const T& x = T(), Color c = RED) :left(nullptr) , right(nullptr) , parent(n原创 2021-03-01 19:12:31 · 197 阅读 · 0 评论 -
C++:图解AVL平衡二叉树的原理
1. AVL树的性质AVL树是一种平衡二叉树,一棵AVL树或者是空树,或者是具有以下性质的二叉搜索树:它的左右子树都是AVL树左右子树高度之差(简称平衡因子)的绝对值不超过1(-1/0/1)2. AVL树的操作...原创 2021-02-27 16:29:30 · 241 阅读 · 0 评论 -
C++:底层数据结构之二叉搜索树
C++:底层数据结构之二叉搜索树1. 二叉搜索树概念二叉搜索树又称二叉排序树。它或者是一棵空树,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树2. 二叉搜索树的特性特性:任意节点都比其左子树中所有节点大,比其右子树中所有节点小最左侧节点一定是最小的,最右侧节点一定是最大的中序遍历:可以得到一个有序序列3. 二叉搜索树的操作二叉搜索树的查找原创 2021-02-27 13:42:11 · 184 阅读 · 0 评论 -
STL中的关联式容器比较及其常用接口测试:map、multimap、set、multiset
STL中的关联式容器比较及其常用接口测试:map、multimap、set、multiset1. 关联式容器的异同点比较2. map常用接口测试2. multimap常用接口测试3. set接口测试4. multiset接口测试1. 关联式容器的异同点比较共同点:底层结构相同—红黑树使用迭代器进行遍历:都是关于key有序的序列(遍历规则:中序插入/查找/删除----O(logN))value值可以重复不同点:map:元素类型为K-V键值对,而且要求key一定要唯一mult原创 2021-02-25 20:19:06 · 182 阅读 · 0 评论 -
C++中的排序算法
C++中的排序算法(必考)1. 排序的概念2.排序的稳定性3. 内部排序和外部排序4. 排序的分类5. 详述各个排序算法5.1 插入排序5.2 希尔排序5.3 直接选择排序5.4 堆排序5.5 冒泡排序5.6 快速排序5.7 归并排序1. 排序的概念排序是将一批无序的记录(数据)重新排列成按关键字有序的记录序列的过程。2.排序的稳定性稳定排序:对于关键字相等的记录,排序前后相对位置不变。不稳定排序:对于关键字相等的记录,排序前后相对位置可能发生变化。3. 内部排序和外部排序内部原创 2021-02-23 23:35:25 · 757 阅读 · 0 评论 -
C++:多态详解
C++:多态详解1. 多态的概念2. 多态的分类2.1 静态多态2.2动态多态3. 动态多态的实现条件4. 虚函数的重写5. 多态的实现原理5.1 对象模型5.2 基类和子类虚表的构建过程5.3 虚函数调用原理6. 抽象类7. 多态相关的面试题1. 多态的概念多态是在不同继承关系的类对象,去调同一函数,产生了不同的行为。通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。举例子来说:比如现在你有两只不同的猫,然后你给猫买了很多小鱼干,一只猫完成吃鱼干这个动原创 2021-02-22 17:45:37 · 1096 阅读 · 0 评论 -
C++:继承详解
C++:继承详解1. 继承的概念2. 继承的格式及其方法3. 基类和派生类的赋值转换4. 继承中的作用域5. 继承类的默认成员函数6. 继承与友元7. 继承与静态成员8. 复杂菱形继承和菱形虚拟继承9. 总结1. 继承的概念继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的原创 2021-02-21 18:24:36 · 749 阅读 · 3 评论 -
C++:模拟实现一个优先级队列
C++:模拟实现一个优先级队列1. 优先级队列介绍优先级队列的底层结构使用的是堆堆:将数据保存在一个数组中形成完全二叉树,如果该完全二叉树中任意节点的值都比其孩子节点大(小),则成为大(小)堆。大(小)堆:堆顶元素是左右元素中最大(小)的优先级队列(堆)的应用:堆排序、TOP-K问题2. 优先级队列的使用优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的位置原创 2021-02-20 20:56:44 · 398 阅读 · 1 评论 -
C++:模拟实现链式队列结构
C++:模拟实现链式队列结构1. 队列队列是一种先进先出的数据结构,数据进入的一段称为队首,数据送出的一段称为队尾队列也分顺序队列和链式队列。链式队列是基于单链表实现的,数据在链表的末端添加,在链表的头部移除。顺序队列则是通过数组来实现的。2. 队列的接口入队操作:Push(const T& data)出队操作:Pop()队列判空:Empty()队首元素:FrontQueue()3. 队列实现#define _CRT_SECURE_NO_WARNINGS 1#i原创 2021-02-20 18:02:46 · 187 阅读 · 0 评论 -
C++:模拟实现顺序栈结构
C++:模拟实现顺序栈结构1. 栈的介绍在数据结构中,栈是很特殊的一种结构,它是先进后出的存储结构,进行数据的插入和删除的一段为栈顶,另外一端为栈底。栈也分为顺序栈和链式栈两种,两中栈采用的线性表不同,实现的机制也有所差异。链式栈可以在链表的一段自由添加元素,顺序栈不可以。2. 栈的接口判栈空: empty()元素进栈: Push(x)元素出栈: Pop()取栈顶元素:Top()3. 实现代码#define _CRT_SECURE_NO_WARNINGS 1#inclu原创 2021-02-20 14:38:59 · 131 阅读 · 0 评论 -
模拟C++中的vector容器
模拟C++中的vector容器代码实现#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>#include<vector>#include<vld.h>#include<assert.h>using namespace std;namespace bit{ template<class T> class vector { public: typedef T* iter原创 2021-01-30 17:32:16 · 135 阅读 · 0 评论 -
C++中vector迭代器失效问题及其解决方法
C++中vector迭代器失效问题及其解决方法迭代器的主要作用就是让算法能够不用关心底层数据结构,其底层实际就是一个指针,或者是对指针进行了封装,比如:vector的迭代器就是原生态指针T*。因此迭代器失效,实际就是迭代器底层对应指针所指向的空间被销毁了,而使用一块已经被释放的空间,造成的后果是程序崩溃(即如果继续使用已经失效的迭代器,程序可能会崩溃)。1. 会引起其底层空间改变的操作,都有可能是迭代器失效,比如:resize、reserve、insert、assign、push_back等。#d原创 2020-10-16 22:15:14 · 3523 阅读 · 2 评论 -
C++中的vector容器常用接口测试
C++中的vector容器常用接口测试vector的构造方法vector中的迭代器vector容量和大小的变更vector的增删改查测试代码 vector.cpp#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>#include<vld.h>#include<vector>using namespace std;vectorint main(){ //vector构造方法 vecto原创 2020-10-15 20:46:16 · 515 阅读 · 0 评论 -
模拟C++中的String类的实现
模拟C++中的String类的实现以下代码实现了C++中String类的大部分重要接口及其功能测试String.cpp#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>#include<string>#include<list>#include<assert.h>#include<vld.h>using namespace std;namespace bit{ cla原创 2020-10-13 19:47:33 · 196 阅读 · 0 评论 -
C++:String中的写时拷贝
C++:String中的写时拷贝定义写时拷贝就是一种拖延症,是在浅拷贝的基础之上增加了引用计数的方式来实现的。引用计数引用计数:用来记录资源使用者的个数。在构造时,将资源的计数给成1,每增加一个对象使用该资源,就给计数增加1,当某个对象被销毁时,先给该计数减1,然后再检查是否需要释放资源,如果计数为1,说明该对象时资源的最后一个使用者,将该资源释放;否则就不能释放,因为还有其他对象在使用该资源。写时拷贝实现大小写转换#define _CRT_SECURE_NO_WARNINGS 1#i原创 2020-10-08 14:34:38 · 324 阅读 · 0 评论 -
C++:String对象的构造及深拷贝
C++中String对象的构造以及深拷贝拷贝构造的实现方式先释放掉_str的内存,然后再申请一个要拷贝的内存空间,再将原对象的值拷贝到目标对象中#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>#include<string>#include<list>#include<assert.h>#include<vld.h>using namespace std;names原创 2020-10-06 18:15:32 · 648 阅读 · 2 评论 -
C++11:string类的常用接口说明及其功能测试
C++11:string类的常用接口说明及其功能测试string类对象的常见构造string类对象的容器操作string类对象的访问及其遍历操作string类对象的修改操作测试代码#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>#include<string>#include<functional>using namespace std;void fun(int n){ string原创 2020-10-03 22:17:59 · 318 阅读 · 0 评论 -
C++进阶:模拟实现STL中list容器
C++进阶:模拟实现STL中list容器C++中list容器提供了双向链表的所有操作,以下代码模拟了其中的部分功能,附有测试用例list_imitate.cpp#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>#include<list>#include<functional>using namespace std;namespace bit{ template <class T>原创 2020-09-28 19:23:44 · 134 阅读 · 0 评论 -
C++11: list容器的迭代及其封装函数的调用
list容器迭代及其封装函数的调用定义list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向 其前一个元素和后一个元素。list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高 效。与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率原创 2020-09-27 16:45:42 · 535 阅读 · 0 评论 -
最小路径和题解
题目给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。示例:输入:[[1,3,1],[1,5,1],[4,2,1]]输出: 7解释: 因为路径 1→3→1→1→1 的总和最小。解题思路:动态规划class Solution {public: int minPathSum(vector<vector<int>>& grid) { in原创 2020-09-25 09:35:22 · 263 阅读 · 0 评论 -
C++中的内存泄漏问题
什么是内存泄漏,内存泄漏的危害什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会 导致响应越来越慢,最终卡死。void MemoryLeaks(){// 1.内存申请了忘记释放int* p1 = (int*)malloc(sizeof(int))原创 2020-07-29 21:27:36 · 283 阅读 · 0 评论 -
malloc/free和new/delete的差异性
malloc/free和new/delete的区别malloc/free和new/delete的共同点是:都是从堆上申请空间,并且需要用户手动释放。不同的地方是:malloc和free是函数,new和delete是操作符malloc申请的空间不会初始化,new可以初始化malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可malloc的返回值为void*, 在使用时必须强转,new不需要,因为new后跟的是空间的类型malloc申请空间失败时,返回的是NU原创 2020-07-29 21:19:39 · 99 阅读 · 0 评论 -
C++中对operator new和operator delete的重载
new和delete操作自定义类型申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用new[]和 delete[]在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc与free不会。new operator 与delete operator 函数new operator 与delete operator 函数是内置函数,无法对其改变, C++中一般所使用的new就是所谓的new operator,它的功能如下:分原创 2020-07-29 21:09:35 · 490 阅读 · 0 评论 -
C++ 日期类Date的实现(运算符重载)
C++ 日期类Date的实现该类综合考察了关于类的基本操作,包括构造,拷贝构造,析构,运算符重载等方面的知识。Date类的内容和实现1. 该日期类主要实现日期时间的加减递增递减等基本运算2. 主要通过运算符重载来实现日期的各种运算3. 重载的运算符之间会反复调用,测试阶段的数据逐一进行测试,易于排错Date.cpp#pragma once#include <iostream>using namespace std;class Date{public: // 获原创 2020-07-26 21:09:58 · 1842 阅读 · 0 评论 -
C++中多个参数的初始化顺序问题
C++中多个参数的初始化顺序问题决定参数初始化顺序的因素1.跟参数列表的初始化顺序无关2.取决于声明对象的顺序实例#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>#include<new>using namespace std;class A{public: A(int x) :m_x(x) { cout << "A::A(int)" << endl; }priva原创 2020-07-24 20:20:54 · 757 阅读 · 0 评论 -
C++ 构造函数、析构函数和拷贝构造的调用
C++ 构造函数、析构函数和拷贝构造的调用构造函数构造函数是在创建给定类型的对象时执行的类方法。构造函数具有与类相同的名称,它通常初始化新对象的数据成员。析构函数析构函数(destructor) 与构造函数相反,当对象结束其生命周期,如对象所在的函数已调用完毕时,系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作。拷贝构造函数拷贝构造函数是一种特殊的构造函数,其形参必须是引用,但并不限制为const,一般普遍的会加上const限制。此函数经常用在函数调用时用户定义类型的值传递原创 2020-07-22 22:35:53 · 237 阅读 · 0 评论 -
C++入门 this指针
C++入门 this指针在 C++ 中,每一个对象都能通过 this 指针来访问自己的地址。this 指针是所有成员函数的隐含参数。因此,在成员函数内部,它可以用来指向调用对象。注意友元函数没有 this 指针,因为友元不是类的成员。只有成员函数才有 this 指针。this指针保存的是当前对象的地址#define _CRT_SECURE_NO_WARNINGS 1#include <iostream>using namespace std;class Test{原创 2020-07-22 20:52:27 · 156 阅读 · 0 评论 -
C++ 自动类型的推导auto
C++ 自动类型的推导auto定义C++11中,标准委员会赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。注意auto不能作为函数的参数auto不能用来声明数组作用简单来说就是自动推导出变量的类型#define _CRT_SECURE_NO_WARNINGS 1#include <iostream>using namespace std;int原创 2020-07-22 19:51:31 · 339 阅读 · 0 评论 -
C++ 引用调用方法
C++引用的使用1.引用不能是空引用2.引用是实体对象的别名3.引用和实体对象共用同一个空间(地址相同)1. 引用的概念#define _CRT_SECURE_NO_WARNINGS 1#include <iostream>using namespace std;int main(){ int a = 10; int &b = a;//引用 cout << a << endl; cout << b << end原创 2020-07-21 21:45:36 · 2213 阅读 · 0 评论 -
C++入门 函数的重载
C++入门 函数重载函数重载的条件1.函数名相同2.参数列表不同(类型不同、参数的数量不同)3.不能只通过返回值的不同形式重载#define _CRT_SECURE_NO_WARNINGS 1#include <iostream>using namespace std;int Max(int a, int b){ return a > b ? a : b;}char Max(char a, char b)//函数重载{ return a > b ?原创 2020-07-21 20:48:17 · 109 阅读 · 0 评论 -
C++命名空间的成员引入
C++命名空间的成员引入1.加命名空间和作用域限定符2.用using namespace 将命名空间引入#define _CRT_SECURE_NO_WARNINGS 1#include <iostream>using namespace std;namespace MySpace{ void fun() { cout << "This is fun 1." << endl; }};namespace YouSpace{ void f原创 2020-07-21 20:23:58 · 265 阅读 · 0 评论