![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 68
头晕神教的神秘人
这个作者很懒,什么都没留下…
展开
-
DFS、BFS经典例题
文章目录深度优先搜索1.n张牌分别放进n个盒子,有几种方案2.leetcode 690 员工重要性3.leetcode 733 图像渲染4.leetcode 130 被围绕的区域5.leetcode 200 岛屿数量广度优先搜搜索1.走迷宫问题2.员工重要性3.N叉树的层序遍历深度优先搜索1.n张牌分别放进n个盒子,有几种方案思路:代码流程:DFS(){处理边界,向上回退尝试当前的每一种可能确定一种可能后,递归处理下一步----DFS(下一步)回收本次处理结果}#include原创 2021-09-13 19:48:03 · 490 阅读 · 0 评论 -
[排序算法] 常见排序算法原理及代码实现
文章目录插入排序----直接插入排序插入排序----希尔排序选择排序---最简单的选择排序各排序算法对比插入排序----直接插入排序思路:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。// 直接插入排序void InsertSort(int* a, int n){ for (int i = 0; i < n - 1; i++) { //将tmp插入到[0,end]这个有序序列 int end = i;原创 2021-08-18 14:40:07 · 229 阅读 · 0 评论 -
[C++] STL之空间配置器
文章目录什么是空间配置器?为什么需要空间配置器一级空间配置器二级空间配置器内存池工作原理内存碎片问题什么是空间配置器?空间配置器,就是用来为各个容器高效的管理空间(空间的申请与回收)的为什么需要空间配置器在模拟实现vector、list、map、unordered_map等容器时,所有需要空间的地方都是通过new申请的,虽然代码可以正常运行,但是有以下不足之处:空间申请与释放需要用户自己管理,容易造成内存泄漏频繁向系统申请小块内存,容易造成内存碎片频繁向系统申请小块内存,影响程序运行效率原创 2021-06-06 18:52:53 · 260 阅读 · 0 评论 -
[C++] 类型转换:static_cast、reinterpret_cast、const_cast、dynamic_cast
static_cast支持所有的隐式类型转换,仅持支父类指针或者引用到子类指针或者引用的强制类型转换不支持其他的强制类型转换。reinterpret_cast支持强制类型转换const_cast去除变量的const属性,将常量去除常性,使其可以被修改。dynamic_cast只能用于多态场景下,父类的引用或指针向子类的引用或指针转换向上转型:子类对象指针/引用->父类指针/引用(不需要转换,赋值兼容规则)向下转型:父类对象指针/引用- >子类指针/引用(用dynamic_ca原创 2021-06-05 16:33:42 · 126 阅读 · 0 评论 -
[C++] 特殊类设计
设计一个类,只能在堆上创建对象方法:构造函数私有化,禁止在类外创建对象提供一个static成员函数在堆上创建对象(new),需要时再调用禁止拷贝,只声明拷贝构造,不实现;或者将拷贝构造声明为delete函数#include<iostream>using namespace std;class HeapObj {private: //构造函数私有化,禁止在类外创建对象 HeapObj() {} //防拷贝 //只声明,不实现 //或声明为delete函数 Heap原创 2021-06-05 15:12:10 · 107 阅读 · 0 评论 -
[C++] C++11中的线程库
文章目录线程库常用接口join()和deatch()原子性操作库线程库在C++11之前,涉及到多线程问题,都是和平台相关的,比如windows和linux下各有自己的接口,这使得代码的可移植性比较差。C++11中最重要的特性就是对线程进行支持了,使得C++在并行编程时不需要依赖第三方库,而且在原子操作中还引入了原子类的概念。要使用标准库中的线程,必须包含< thread >头文件。常用接口函数名功能thread()构造一个线程对象,没有关联任何线程函数,即没有启动原创 2021-06-05 14:32:22 · 417 阅读 · 0 评论 -
[C++] 哈希的应用:位图和布隆过滤器
思考问题:给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。【腾讯面试题】像这类题基础的思路应该排序+查找,但是这里题目要求有40亿个不同的整数,仅存储数据就要占用16G的内存,内存消耗过大,所以这里常规方法肯定行不通。采用位图解决:数据是否在给定的整形数据集合中,结果是在或者不在,刚好是两种状态,那么可以使用一个二进制比特位来代表数据是否存在的信息,如果二进制比特位为1,代表存在,为0代表不存在。如图:位图所谓位图,就是用每一个比特位来存放某种原创 2021-05-31 15:30:32 · 309 阅读 · 1 评论 -
[C++] 哈希表(散列表)详解
文章目录概述插入元素搜索元素哈希函数常见的哈希函数哈希冲突闭散列线性探测闭散列增容闭散列--线性探测代码:★开散列开散列的增容哈希表的迭代器实现:开散列代码:概述哈希表又称散列表,是根据关键码值(Key,value)直接进行访问的数据结构。哈希结构中存在一种函数使元素的存储位置与它的关键码之间能够建立一一映射的关系,以便于在查找时通过该函数可以很快找到该元素。这种函数称为哈希函数。插入元素根据插入元素的关键码值,用哈希函数计算出插入位置进行存放。搜索元素用哈希函数计算出该元素的存储位置,然后在原创 2021-05-27 10:32:42 · 1382 阅读 · 3 评论 -
[C++] 红黑树详解
文章目录红黑树红黑树和AVL树对比红黑树的结构红黑树的插入情况一情况二情况三红黑树红黑树,一种特殊的二叉搜索树, 为每个结点描述了颜色(红色或黑色),通过对所有结点的着色方式限制,红黑树确保了没有一条路径会比其他路径的长度超出两倍,因而是近似平衡的。红黑树的性质:红黑树通过以下性质来实现近似平衡结构:根节点是黑色的 ;每个结点不是红色就是黑色;如果一个节点是红色的,则它的两个孩子结点是黑色的 ; (红色结点不能连续出现)对于任意结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数原创 2021-05-22 13:13:39 · 2443 阅读 · 13 评论 -
【C++】AVL树:平衡二叉搜索树;插入,左旋,右旋,双旋
文章目录概述平衡因子概述平衡二叉搜索树又被称为AVL树,且具有以下性质:在AVL树中任何节点的两个子树的高度最大差别不超过1,所以它也被称为高度平衡树,并且它的左右两个子树都是一棵平衡二叉树。AVL树的增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。使用AVL树的可以防止二叉搜索树退化为单边树。平衡因子一个结点的右子树高度减去左子树高度所得的值,就是该节点的平衡因子,范围:[-1,1]...原创 2021-05-15 18:49:24 · 458 阅读 · 0 评论 -
【C++】二叉搜索树KV模型
不了解二叉搜索树可以阅读我上一篇博客:二叉搜索树KV模型:每一个关键码key,都有与之对应的值Value,即<Key, Value>的键值对。该种方式在现实生活中非常常见:比如英汉词典就是英文与中文的对应关系,通过英文可以快速找到与其对应的中文,英文单词与其对应的中文<word, chinese>就构成一种键值对;再比如统计单词次数,统计成功后,给定单词就可快速找到其出现的次数,单词与其出现次数就是<word, count>就构成一种键值对。比如:实现一个简单的原创 2021-05-11 11:49:47 · 243 阅读 · 0 评论 -
【C++】多态:虚函数、重写、抽象类、虚函数表
文章目录概述实现在C++中实现多态需要满足的条件虚函数重写override关键字 final关键字抽象类接口继承和实现继承虚函数表概述多态的概念:通俗讲就是多种形态,具体来说就是当需要完成某个行为时,由不同的对象去完成会产生不同的结果。 比如乘车买票,普通人必须买全票,学生可以买半票。实现在C++中实现多态需要满足的条件1、前提:发生继承2、父类中要有虚函数3、调用虚函数的类型必须是指针或者引用4、虚函数需要在子类中被重写5、一般是通过父类的指针或者引用来调用虚函数 (可以将子类原创 2021-05-09 11:22:03 · 521 阅读 · 2 评论 -
[数据结构]二叉搜索树 / 二叉排序树
概述二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:① 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值② 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值③ 它的左右子树也分别为二叉搜索树例如:实现结点定义template <class T> //泛型struct BNode { T data_; typedef BNode<T> Node; //别名 Node* left; Node* right; BN原创 2021-05-02 22:38:41 · 270 阅读 · 0 评论 -
【C++】多继承,菱形继承,菱形虚拟继承
关于继承的基本概念可以阅读我的上一篇博客:C++中的继承多继承一个子类有两个或以上直接父类时称这个继承关系为多继承格式:class A{};class B{};//派生类:继承方式:类名,继承方式:类名, ......class C:public: A,public: B{};此时类C中包含B和A中的所有成员菱形继承:一种特殊的多继承菱形继承存在的问题:#include<iostream>using namespace std;class A {public:原创 2021-04-28 21:21:09 · 702 阅读 · 6 评论 -
【C++基础知识】继承
概述概念:在保持原有类的特性的基础上进行扩展,增加功能,产生新的类;原有类被称为父类或者基类;新的类成为子类或者派生类、目的:实现代码复用特点:继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程,继承是类设计层次的复用。定义格式继承方式和访问限定符继承关系:public继承----公有继承protected继承----保护继承private继承----私有继承访问限定符:public,protected,private注意:继承方式是发生继承时在类外生效,而访问限定原创 2021-04-28 19:42:26 · 166 阅读 · 0 评论 -
[剑指offer]jz. 28 数组中出现次数超过一半的数字 哈希结构+摩尔投票算法
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。解法一:1、定义一个数组num[ ]存放数组中的数字出现的次数2、遍历数组,每遇到一个数字,假设为i,就将num[ ]中的第i项的值+13、判断并返回num[ ]中出现次数大于数组长度一半的数字(注意:此处应该返回的是项数i的值)时间复杂度为O(n)//数组中出现次数超过一半的数原创 2021-04-21 15:50:17 · 145 阅读 · 1 评论 -
【C++基础知识】模板的特化
非类型模板原创 2021-04-21 09:36:51 · 244 阅读 · 0 评论 -
【C++基础知识】deque、vector、list的优缺点比较
list:优点:任意位置操作性能高(插入删除):O(1)缺点:不支持随机访问,空间利用率低,容易造成内存碎片vector优点:随机访问,尾部操作性能高,空间利用率高,不容易造成内存碎片缺点:中间和头部操作行性能较差:O(n),增容代价大(深拷贝)deque优点:支持随机访问(性能略低于vector),头部和尾部操作性能高:O(1),增容代价小缺点: 中间位置的操作性能低:O(n)...原创 2021-04-20 14:34:15 · 711 阅读 · 0 评论 -
【C++基础知识】queue的模拟实现
queue:队列具有先进先出的特点,其pop操作时会删除队首元素,也就是当前序列的第一个元素所以此处我们不能使用vector来实现queue,一位内vector没有头删的接口实际操作十分简单,调用deque或者list的底层接口即可,直接看代码:#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>#include<vector>#include<queue>#include<list>#in原创 2021-04-19 18:44:04 · 209 阅读 · 0 评论 -
【C++基础知识】模拟实现优先队列
优先队列的概念—priority_queue普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列(priority_queue)中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出的行为特征。优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)。优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其原创 2021-04-19 10:39:13 · 323 阅读 · 0 评论 -
【C++基础知识】stack的模拟实现
方法一:用vector模拟实现stack#include<iostream>#include<list>#include<vector>using namespace std;template <class T>class Stack {public: void push(const T&val) { st_.push_back(val); } void pop() { st_.pop_back(); } T&原创 2021-04-12 18:56:16 · 366 阅读 · 0 评论 -
[leetcode]150. 逆波兰表达式求值
思路:按照tokens数组的顺序将操作数按照整数形式全部压入栈中,若遇到运算符,则去栈顶的两个元素进行运算,将结果再压入栈中,循环执行,直到tokens中的数据全部读完,此时栈中仅剩一个数据,就是正确的运算结果。图示:代码:class Solution {public: int evalRPN(vector<string>& tokens) { stack<int>st; for(const auto&s.原创 2021-04-12 13:49:01 · 205 阅读 · 0 评论 -
【剑指offer】栈的压入、弹出序列
牛客网链接:栈的压入、弹出序列.解析:题目要求,给定入栈序列和出栈序列,判断该出栈序列是否合法,即按照给定的顺序入栈,能否得到给定的出栈序列思路:按照给定的入栈序列和出栈序列,模拟栈的压入和弹出操作,如果操作完毕后栈为空,则正确,否则错误具体操作:1、每次入栈一个元素,判断栈顶元素和出栈序列的待出栈元素是否相同:相同,出栈,继续比较;不同,将入栈序列中的下一个元素入栈2、判断栈空为空:正确,返回true非空:错误,返回falseclass Solution {publi.原创 2021-04-12 11:54:19 · 226 阅读 · 0 评论 -
【C++基础知识】vector的模拟实现
文章目录概述vector泛型定义构造size() capacity() begin() end()reserveresizepushBackinserteraserpopBack[ ]运算符重载读写操作完整代码概述vector是表示数组大小可以改变的序列容器。与数组一样,vector使用连续的存储位置存储元素,这意味着也可以使用指向其元素的常规指针上的偏移量(迭代器)来访问它们的元素,并且与数组中的一样高效。但与数组不同的是,它们的大小可以动态变化,其存储由容器自动处理。与数组相比,vect原创 2021-04-05 13:16:47 · 354 阅读 · 1 评论 -
面试中string类的一种正确写法
C++ 的一个常见面试题是让你实现一个 String 类,限于时间,不可能要求具备 std::string 的功能,但至少要求能正确管理资源。具体来说:1、能像 int 类型那样定义变量,并且支持赋值、复制。2、能用作函数的参数类型及返回类型。3、能用作标准库容器的元素类型,即 vector/list/deque 的 value_type。(用作 std::map 的 key_type 是更进一步的要求,本文从略)。换言之,你的 String 能让以下代码编译运行通过,并且没有内存方面的错误。vo转载 2021-04-03 17:27:58 · 230 阅读 · 0 评论 -
【C++基础知识】list常用接口
文章目录list简介list的构造接口list的迭代器list的插入接口list的删除接口swaplist capacityfront和backlist简介list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。与原创 2021-04-03 16:18:35 · 441 阅读 · 1 评论 -
【C++基础知识】vector
vector介绍vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候原创 2021-03-27 18:41:49 · 2508 阅读 · 0 评论 -
【C++基础知识】string类
string类原创 2021-03-25 11:53:05 · 347 阅读 · 1 评论 -
【C++基础知识】泛型编程--模板
文章目录泛型编程函数模板概念:函数模板的格式函数模板的实例化函数模板的参数匹配原则类模板类模板的定义格式类模板的实例化泛型编程首先思考一个问题:如何实现一个通用的交换函数呢?这里很多人可能会想到函数重载,没错,函数重载可以实现不同类型数据的交换,但是也有很大的缺陷:重载的函数仅仅只是类型不同,代码的复用率比较低,只要有新类型出现时,就需要增加对应的函数代码的可维护性比较低,一个出错可能所有的重载均出错那能否给编译器一个模子,让编译器根据不同的类型利用该模子来生成代码呢?这里就要印入泛原创 2021-03-18 21:00:59 · 423 阅读 · 0 评论 -
【C++基础知识】C\C++内存管理
文章目录C语言中的动态内存管理方式mallocfreecallocreallocC++中的动态内存管理方式new和delete内置类型自定义类型malloc/free和new/delete的区别首先阅读代码思考问题:int globalVar = 1;static int staticGlobalVar = 1;void Test(){ static int staticVar = 1; int localVar = 1; int num1[10] = {1, 2, 3, 4}; ch原创 2021-03-18 18:35:28 · 266 阅读 · 0 评论 -
【C++基础知识】友元,内部类,友元函数重载<<和>>
文章目录友元友元函数友元类内部类友元友元分为友元函数和友元类友元提供了一种突破封装的方式,有时提供了便利。但是友元会增加耦合度,破坏了封装,所以友元不宜多用。友元函数既可以是不属于任何类的非成员函数,也可以是另一个类的成员函数,统称为友元函数。友元函数不是当前类的成员函数,而是独立于当前类的外部函数,但它可以访问该类所有的成员,包括私有成员,保护成员贺公有成员。在类中声明友元函数时,需要在其函数名前加上friend关键字,可以放在类的任何位置,不受访问限定符约束。其定义放在类内类外皆可。原创 2021-03-14 20:02:09 · 318 阅读 · 0 评论 -
【C++基础知识】static成员,C++11的成员初始化新方法
static静态成员声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的成员函数,称之为静态成员函数。静态的成员变量一定要在类外进行初始化特性:1.静态成员为所有类对象所共享,不属于某个具体的实例2.静态成员变量必须在类外定义,定义时不添加static关键字3.类静态成员即可用 类名::静态成员 或者 对象.静态成员来访问4.静态成员函数没有隐藏的this指针,不能访问任何非静态成员5.静态成员和类的普通成员一样,也有publ原创 2021-03-04 19:45:58 · 525 阅读 · 1 评论 -
【C++基础知识】初始化列表,单参构造函数的隐式类型转换
文章目录初始化列表:单参构造函数的隐式类型转换 explicit关键字初始化列表: 以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个成员变量后面跟一个放在括号中的初始值或表达式。例如:class Date{public: Date(int year, int month, int day): _year(year), _month(month), _day(day) {} private: int _year; int _month; int _day;};原创 2021-03-04 17:19:36 · 541 阅读 · 1 评论 -
【C++基础知识】常成员函数,常引用
文章目录const修饰类的成员函数--常成员函数常引用const修饰类的成员函数–常成员函数将const修饰的类成员函数称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,作用是在该成员函数中不能对类的任何成员进行修改。格式: 类型说明符 函数名(参数表)const;例如:void showDate()const;说明:1、常成员函数可以访问常数据成员,也可以访问普通数据成员。常数据成员可以被常成员函数访问,也可以被普通成员函数访问。2、如原创 2021-03-02 21:37:11 · 2391 阅读 · 0 评论 -
【C++基础知识】this指针
首先请阅读下面的示例代码:class Date{ public : void Display () { cout <<_year<< "-" <<_month << "-"<< _day <<endl; } void SetDate(int year , int month , int day) { _year = year; _month = month; _day = day; }原创 2021-02-17 16:57:31 · 342 阅读 · 0 评论 -
【C++基础知识】C++中引用的知识点解析
C++中的引用引用的概念建立引用的作用通常是为变量起另一个名字,变量的引用通常被认为是变量的别名。在声明一个引用时,必须用另一个变量来将其初始化。例如:int i=5;int j=&i; //声明j是一个整型变量变量的引用,并用i将其初始化。此处j可以看作是变量i的一个别名,经过这样的声明后i和j的作用相同,代表同一个变量。对其进行的操作也是等价的,例如改变j的值,i的值也会随之发生变化。变量和引用的关系#include<iostream>原创 2020-12-14 18:52:10 · 394 阅读 · 0 评论 -
【C++基础知识】const修饰符
const修饰符在C语言中,我们习惯用#define来定义常量,例如#define MAX 100实际上,这种方法只是在预处理时进行字符的置换,将所有的"MAX"替换成"100",过后程序中不再有MAX这个标识符。这个MAX不是变量,没有类型,不占内存,容易出错。C++提供了一种更为灵活安全的方式来定义常量,即使用const来修饰常量,例如:const int MAX=100;此处的MAX是有类型的,占用存储单元,有地址,可以用指针指向它,但是不能改变其值。看下面这段代码:#inclu原创 2020-12-05 17:33:00 · 499 阅读 · 0 评论 -
【C++基础知识】一条简单的C++程序
c++源程序的构成先来看一个简单的c++程序//sum.cpp#include<iostream> //编译预处理命令using namespace std; //使用命令空间stdint main() //主函数 { int x,y,sum; //定义三个整型变量x,y,sum cin原创 2020-12-05 16:58:06 · 495 阅读 · 0 评论