![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 84
ych9527
这个作者很懒,什么都没留下…
展开
-
工厂模式—C++代码demo解释
工厂模式一、是什么工厂模式解决的主要问题是,将原来分布在各个地方的对象创建的过程单独抽离出来,交付给工厂来处理,其它地方想要使用直接调用工厂方法获取对象即可我们可以抽象出一些类的公共接口来形成抽象父类或者接口,这样就可以通过声明一个指向父类的指针,来指向子类的实际实现,达到多态的目的二、优缺点优点定义创建对象的接口,封装了对象创建的过程使具体化类的工作延迟到了子类之中缺点程序员必须知道子类的名字,当子类非常多的时候命名是一件非常麻烦的事情在父类之中并不知道具体要实例化哪一个原创 2021-11-02 13:30:20 · 637 阅读 · 0 评论 -
B+、B*树
文章目录1.什么是B+树2.B+树的特性3.B+树的插入过程4.B+树查找的优点5.B*树6.小结7.数据库和B+树的关系8.Mysql两种引擎8.1MyISAM8.2InnoDB1.什么是B+树B树是对B-树的优化和变形,也是一种多路搜索树,其定义和B-树基本相同,差别如下:每个节点中关键字的数量和孩子数量相等根节点的关键字数量为[1,M]非根节点关键字数量为[M/2,M]所有的值都会出现在叶子节点上,并且所有的叶子节点都会用一个指针链接起来(方便遍历),因此只需要遍历叶子节点即可原创 2021-07-17 20:10:39 · 333 阅读 · 0 评论 -
探索B-树
文章目录1.什么是B-树2.B-树的性质3.B-树插入过程4.B-树的效率6.B-树是怎么做到减少与内存交互的次数的1.什么是B-树B树,是一棵适用于外查找(硬盘查找)的树。 我们常见的查找树有AVL树、红黑树,但是这些都是用于内查找(内存之中),这些树的查找效率为树的高度,即O(lgN)如果在外查找中,也是用这种结构,每一层都需要访问一次硬盘,而访问硬盘的速度是比较慢的,为了提高外查找的效率,提出了一种平衡的多叉树由于二叉搜索树,每多一层,就需要多访问一次硬盘,所以B树就是压缩了高度的二叉搜索树原创 2021-07-17 20:07:01 · 256 阅读 · 0 评论 -
并查集原理分析
文章目录1.并查集是什么2.并查集性质3.并查集可以解决的问题4.并查集模板5.并查集的应用1.并查集是什么在一些应用问题中,需要将n个不同的元素划分成一些不相交的集合。开始时**,每个元素自成一个单元素集合**,然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询某一个元素归属于那个集合的运算。适合于描述这类问题的抽象数据类型称为并查集2.并查集性质由上图可知,并查集有如下几点性质数组下标对应集合中元素的编号根下标对应的内容为负数子元素下标对应的内容为根的下标(子元原创 2021-07-14 21:25:34 · 230 阅读 · 1 评论 -
了解基数树
基数树形态性质基数树其实就是多层哈希映射,解决整形与指针之间的映射关系当某一层的位置有映射时,才选择多扩建一层哈希映射可以根据需要开辟空间,而不是直接将空间开辟好优点提高访问的效率,不需要像哈希表一样进行内存如果想要产生可以在一定 消耗比如,有范围 1~200万范围的数据需要进行映射,如果用普通的一维数组进行哈希映射,那么在一开始,就需要开辟巨大的空间,如果采用基数树,则可以先开辟一段小的空间,当发生了冲突的时候,再选择开辟空间,进行二次映射...原创 2021-07-10 08:40:31 · 459 阅读 · 0 评论 -
C++ 特殊类的设计
1. 请设计一个类,只能在堆上创建对象实现方式:1.将类的构造函数私有(不能直接定义对象了)2.提供一个静态的成员函数,在该静态成员函数中完成堆对象的创建(因为,构造函数私有,在外面不能调动,就需要成员函数去调动,而成员函数需要成员调动,但是不能创建成员,因此用一个静态函数去调用构造函数)3.创建出来的对象虽然是在堆上的,但是由于拷贝函数的存在,可能会拷贝到栈上,因此将拷贝构造声明为私有的且不实现,或者直接删除掉只声明不实现的原因是,防止内部进行拷贝。私有的原因是,防止外部进行定义当然,最简洁的原创 2021-06-19 17:21:46 · 257 阅读 · 0 评论 -
内存池介绍
文章目录1.什么是内存池1.1池化技术1.2内存池2.为什么需要内存池3.内存池的发展3.1早期内存池3.2定长内存池分配器3.3哈希映射的FreeList内存池4.实现一个定长内存池1.什么是内存池1.1池化技术池是计算机中常用的一种设计模式,其特点是将资源提前申请好,放在’‘资源池’'之中由程序自己控制资源的使用,这样减少了与内核的交互因为资源的申请是需要通过内核来完成的,与内核交互的频率越高, 程序的效率就越低,提前将资源申请出来,使用资源的时候不需要再向内核申请,直接就可以使用,在一定程度上原创 2021-07-02 11:09:33 · 889 阅读 · 0 评论 -
探索智能指针
文章目录1.为什么需要智能指针2.三种智能指针使用及原理分析2.1 auto_ptr2.2 unique_ptr2.3shared_ptr2.3.1原理2.3.2线程安全问题2.3.3循环引用问题2.3.4删除问题3.总结1.为什么需要智能指针程序员自己控制的内存,在一些特殊场景之下,有可能发生内存泄漏,智能指针则可以帮助对内存进行管理智能指针采用的RAII思想 -> 利用对象的生命周期来控制程序资源,在对象构建的时候获取资源,在对象析构的时候释放资源,即将对资源的管理工作,托付给了一个对象,这原创 2021-06-18 15:32:54 · 260 阅读 · 1 评论 -
C++ 11异常
文章目录1.异常的概念2.异常的使用2.1异常的抛出和捕获2.2异常的重新抛出2.3异常安全2.4异常规范2.5实际写法2.6异常的优缺点1.异常的概念异常是一种处理错误的方式,当一个函数发现自己无法处理的错误时就可以抛出异常,让函数的直接或间接的调用者处理这个错误throw: 当问题出现时,程序会抛出一个异常。这是通过使用 throw 关键字来完成的try: try 块中的代码标识将被激活的特定异常,它后面通常跟着一个或多个 catch 块catch: 在您想要处理问题的地方,通过异常处理程序捕原创 2021-06-17 14:03:28 · 560 阅读 · 1 评论 -
C++11常用语法-贰
文章目录1.完美转发2.lambda表达式2.1为什么需要lambda表达式2.2格式2.3用法分析2.4捕捉列表说明2.5注意点3.线程库3.1线程库的介绍3.2使用时的注意点3.3线程函数的参数3.4线程资源回收3.4.1join()方式3.4.2 detach()方式3.5并发和并行的区别1.完美转发完美转发指的是在函数模板中,完全依照模板的参数的类型,将参数传递给函数模板中调用的另外一个函数完美转发是目标函数总希望将参数按照传递给转发函数的实际类型转发给目标函数,而不产生额外的开销,就好像转发原创 2021-06-16 18:21:17 · 935 阅读 · 6 评论 -
C++11常用语法-壹
文章目录1.列表初始化1.1内置类型列表初始化1.2自定义类型列表初始化2.变量类型的推导2.1 编译时类型推导auto2.2运行时类型推导 decltype1.列表初始化C++ 98之中,只能对数组进行列表初始化,在C++ 11 之中添加了新语法,可以对内置类型列表初始化、自定义类型的列表初始化1.1内置类型列表初始化1.2自定义类型列表初始化1.支持单个对象的列表初始化2.多个对象的列表初始化(不支持序列式类型)多个对象想要初始化,需要给该类添加一个带有initializer_list原创 2021-06-16 12:00:47 · 493 阅读 · 0 评论 -
哈希的应用
文章目录1.前言2.位图2.1什么是位图2.2实例分析2.3位图的应用2.4位图的实现3.布隆过滤器3.1布隆过滤器的提出3.2布隆过滤器的概念3.3布隆过滤器的应用3.4布隆过滤器的设计3.5布隆过滤器的优点3.6布隆过滤器的缺陷1.前言哈希是一种映射的思想,哈希表是基于这种思想的最常用的数据结构,除此之外,还有一些经常用到哈希思想的地方,下面进行介绍2.位图2.1什么是位图所谓位图就是用每一位来存放某种状态,适用于海量的数据,数据无重复的场景。通常用来判断某个数据在或者不在的情况2.2实例分原创 2021-06-14 08:14:03 · 371 阅读 · 0 评论 -
哈希表底层探索
文章目录1.unordered_ map、unordered_set1.1介绍1.2效率对比1.3实战演练2.哈希2.1哈希的概念2.2哈希函数2.2.1设计原则2.2.2常见哈希函数2.2.2.1常用哈希函数2.2.2.2 不常用哈希函数2.3哈希冲突3.闭散列3.1线性探测3.2闭散列扩容-载荷因子3.3二次探测3.4平均查找长度3.5模拟实现4.开散列4.1开散列概念4.2开散列扩容4.3总结(开散列和闭散列的比较)4.4代码实现以及效果验证1.unordered_ map、unordered_se原创 2021-06-12 09:30:29 · 1036 阅读 · 11 评论 -
红黑树的实现、map、set的封装
1.红黑树概念、性质1.1什么是红黑树红黑树,是一种二叉搜索树,但是在每个节点上增加了一个存储位,标识节点的颜色,可以是RED或者BLACK。通过对任何一条从根到叶子的路径上各个节点着色方式的限制,红黑树确保没有一条路径会比其它的路径长出两倍(最长路径<=2倍最短路径),因此是接近平衡的1.2红黑树的性质1.每个节点不是红色就是黑色的2.根节点是黑色的3.没有连续的两个红色节点4.对于每个节点,从该节点到其后代叶节点的路径上,均包含相同的黑色节点(每条路径上的黑色节点的总数是相同的)5原创 2021-06-02 21:51:14 · 429 阅读 · 10 评论 -
一文知晓AVL树底层实现
1.AVL树的基本概念1.1为什么需要set/map底层用的都是二叉搜索树,但是普通的二叉搜索树是有缺陷的,如果往树中插入的元素是有序的或者是接近有序的,那么树就越接近链表的形式,那么查找和插入的效率就变成了O(N)。因此map、set等关联式容器的底层结构是对二叉搜索树进行了平衡处理的,即采用平衡二叉树搜索树(AVL树)1.2性质当向二叉搜索树中插入新的节点后,如果能保证每个节点的左右子树高度只差绝对值不超过1,即保证了这棵树是AVL树,即有如下量大特点:左右子树都是AVL树左右子树的高度之原创 2021-05-26 09:25:14 · 369 阅读 · 13 评论 -
set、map的使用
文章目录1.关联式容器2.键值对3.树形结构的关联式容器4.set的使用介绍4.1set的模板参数4.2使用介绍4.2.1排序和去重4.2.2查找5.map的使用介绍5.1模板参数5.2元素插入5.3元素的交换5.4排序、去重、统计次数5.5查找5.6删除5.7[]原理5.8map实际应用6.multiset、multimap6.1实际应用1.关联式容器vector、list、deque等容器被称之为序列式容器,因为它们的底层为线性序列的数据结构,里面存储的是元素的本身关联式容器也是用来存储数据的,与原创 2021-05-24 16:18:11 · 678 阅读 · 9 评论 -
C++多态——后传
文章目录1.c++ 11中override 和 final1.1fina1.2 overrride2.重载、覆盖(重写)、隐藏(重定义)的对比3.抽象类3.1什么是抽象类3.2演示3.3接口继承和实现继承4.多态的原理4.1虚函数表4.2原理分析5.动态绑定与静态绑定6.什么是多态6.1静态多态6.2动态多态7.单继承和多继承关系的虚函数表7.1单继承中的虚函数表7.2多继承中的虚函数表1.c++ 11中override 和 finalC++对函数的重写要求是比较严格的(三同),对于使用者来说很有可能因原创 2021-05-11 08:27:17 · 505 阅读 · 4 评论 -
C++多态——前传
1.多态是什么通俗来说,多态就是多种形态。即去完成某个动作(同样的动作),当不同的对象去完成时,会产生不同的状态比如:我们抢红包的动作是一样的,但是每个人抢到的金额的大小是不同的2.多态的定义和实现条件多态的实现,是用不同继承关系的类对象,去调用同一函数,产生了不同的行为2.1必须满两个条件在继承中要构成多态必须满足两个条件:1.必须通过基类的指针或者引用调用虚函数2.被调用的函数必须是虚加密手机,且派生类必须对基类的虚汗数进行重写...原创 2021-04-28 19:52:45 · 290 阅读 · 0 评论 -
C++继承
文章目录1.继承是什么2.继承的定义格式3.继承方式和访问限定符4.基类和派生类对象赋值5.继承之中的作用域6.派生类的默认成员函数7.继承与友元8.继承与静态成员1.继承是什么继承是什么:继承是面向对象程序设计、使得代码可以复用的重要手段,它允许程序员在保持原有特性的基础上进行扩展,增加功能,这样产生的新类,称之为派生类继承的目的:让子类继承和复用父类定义的成员和方法,相当于将父类的代码全部拷贝一份2.继承的定义格式3.继承方式和访问限定符1.由上表可知,子类的访问方式=min(基类的原创 2021-04-28 14:57:19 · 622 阅读 · 2 评论 -
进一步理解模板
文章目录1.非类型模板参数2.模板的特化2.1是什么1.非类型模板参数模板参数分:类型形参与非类型形参类型形参即:出现在模板参数列表中,跟在class或者typename之类的参数类型名称非类型形参:就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当作常量来用需要注意的几点:1.浮点数、类对象以及字符串是不允许作为非类型模板参数的(即只允许整形家族:int、long、longlong、char)2.非类型模板参数必须在编译期就能确认结果2.模板的特化2.1是什么原创 2021-04-22 11:08:52 · 222 阅读 · 0 评论 -
stack和queue
文章目录1.栈和队列常用接口2.容器适配器3.deque3.1是什么3.2deque的优缺点3.3deque作为stack和queue的优势4.stack模拟实现5.queue模拟实现1.栈和队列常用接口2.容器适配器容器适配器是一种设计模式(设计模式是一套被反复使用,被广泛认可,经过分类编目的代码设计经验总和),该种模式是将一个类的结构转换成客户希望的另外一个接口stack和queue,就是容器适配器,因为stack和queue只是对其它容器的接口进行了包装,STL中stack和queue默认使原创 2021-04-17 21:30:58 · 332 阅读 · 0 评论 -
list用法和模拟实现
文章目录1.list用法1.1list介绍1.21.3 list iterator1.4 list capacity1.5 list element access1.6 list modifiers2.list迭代器失效问题3.list的模拟实现1.list用法1.1list介绍1.list是带头的双向循环链表,支持在任意位置的插入和删除,可以前后双向迭代forward_list为单向链表,只支持往前迭代,不支持往后迭代2.list的插入效率比vector效率要高,因为不需要数据的移动3.lis原创 2021-04-14 16:29:18 · 247 阅读 · 0 评论 -
模拟实现vector
文章目录1.实现前的知识点1.实现前的知识点使用类模板时,声明和定义不要分离,分离会导致链接错误由于声明和定义不分离,所以很多时候都将.h文件写成.hpp文件,表示我的成员函数定义在类里面平时我们应该将声明和定义分离,这样可以更好的看见类的整体框架并且我们可以将代码短小的函数放在类里面,让它默认称为内联函数...原创 2021-04-06 09:22:12 · 649 阅读 · 5 评论 -
vector常用接口
文章目录1.vector介绍2.构造函数2.1默认构造函数2.2半缺省构造2.3拷贝构造2.4迭代器构造3.元素访问方式3.1[下标]访问、迭代器访问3.2范围for需注意陷阱4.容器接口4.1max_size(无用接口)4.2size、capacity、reserve、resize4.2.1使用展示4.2.2capacity增容规则4.3[]访问4.4swap4.5push_back、pop_back4.6insert、erase4.7迭代器失效4.8find1.vector介绍1.是表示大小可以改变原创 2021-04-01 14:49:53 · 1688 阅读 · 0 评论 -
string类的模拟实现
文章目录1.简单string类的模拟实现1.1构造函数编写需要注意的几点1.简单string类的模拟实现1.1构造函数编写需要注意的几点namespace ms{ class string { public: string(char *str="")//等价于char *str="\0" NULL等价于'\0',strlen时会报错 :_str(new char[strlen(str) + 1]) { strcpy(_str, str); } ~strin原创 2021-03-30 18:22:53 · 264 阅读 · 0 评论 -
了解STL、初识string
文章目录1.STL1.1 什么是STL1.2 STL六大基本组件1.3为什么要学习STL1.4STL的缺陷2.什么是string类2.1为什么学习2.2了解string类3.string成员函数3.1 string构造函数3.2string类对象容器(数据结构)操作4.string类对象的访问和遍历1.STL1.1 什么是STLSTL是C++标准库的重要组成部分,不仅仅是一个可复用的组件库,还包罗数据结构与算法的软件框架;STL的原始版本出自惠普实验室,并且进行了开源,允许任何人进行任何操作,唯一条原创 2021-03-20 12:30:32 · 2059 阅读 · 4 评论 -
泛型编程、函数模板、类模板
文章目录1.泛型编程2.函数模板2.1是什么2.2函数模板格式2.3函数模板的原理2.4函数模板实例化2.5模板参数的匹配原则3.类模板3.1类模板的定义格式1.泛型编程编写与类型无关的通用代码作为模板。接下来将介绍函数模板和类模板两种2.函数模板2.1是什么函数模板代表的是一个函数的家族,该函数模板与类型无关,在使用时被参数化,根据实参产生的特定函数模板;2.2函数模板格式template < typename T1, typename T2, … typename Tn>原创 2021-03-12 17:27:34 · 217 阅读 · 0 评论 -
动态内存管理
文章目录1.C++中为什么要更新动态内存的管理方式2.new/delete用法1.C++中为什么要更新动态内存的管理方式C语言管理内存的方式在C++中还是可以用的,绝大部分语言是具有包容性的。C++中提出了自己的内存管理方式:通过new和delete操作符进行内存管理;既然C语言中的内存管理方式可以用,为什么C++要有新的方法呢?这是因为针对内置类型C和C++的管理方式没有区别,针对自定义类型的时候,malloc和free只管开空间和调用析构函数。new和delete会进行开空间,调构造函数,调析构原创 2021-03-12 14:48:33 · 1051 阅读 · 4 评论 -
类和对象——登堂入室
文章目录1.构造函数之初始化列表1.1构造函数体赋值1.2初始化列表1.2.1是什么是初始化列表1.2.2需要注意的几点1.构造函数之初始化列表1.1构造函数体赋值在创建对象时,编译器会通过调用构造函数,给对象中各个成员变量一个合适的初始值,如下图代码所示:如上图所示,尽管构造函数被调用后,对象中已经有了一个初始值,但是这不能称为类对象成员的初始化。因为调用构造函数的时候就已经进行了对象成员的定义,构造函数体内的语句只能将其称之为赋初值。且初始化只能初始化一次,而构造函数体内可以多次赋值1.2原创 2021-03-06 11:11:23 · 3833 阅读 · 23 评论 -
类和对象的应用练习——日期类
#ifndef _DATE_H_#define _DATE_H_#include <iostream>using namespace std;class Date{public: int GetMonthDay(int year, int month);//获取某年某月的天数 Date(int year = 1999, int month = 1, int day = 1);//全缺省构造函数 void Print();//打印函数; Date(const Date原创 2021-03-01 22:11:18 · 292 阅读 · 0 评论 -
类和对象——略领天机
文章目录1.类的6个默认成员函数2.构造函数2.1构造函数是什么2.2构造函数的特征3.析构函数3.1析构函数是什么3.2析构函数的特征4.拷贝构造函数4.1拷贝构造函数是什么4.2拷贝构造函数的特征5.赋值运算符重载5.1运算符重载5.2赋值运算符的重载1.类的6个默认成员函数如果一个类中什么成员都没有,简称空类。空类中并不是什么都没有,任何一个类在我们不写的情况下,都会自动生成6个默认成员函数;默认成员函数是由编译器自动生成,我们写了就使用自己写的。我们学习编写默认成员函数是因为编译器自动生成的默原创 2021-03-01 17:51:25 · 359 阅读 · 0 评论 -
类和对象——初入江湖
文章目录1.面向过程和面向对象的去呗2.什么是类3.类的定义3.1类的第一种定义方式1.面向过程和面向对象的去呗C语言是面向过程的,关注的是实现的过程,分解出解决一个问题的步骤,通过调用函数来逐步解决问题;C++是面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成;举个简单的例子:我们点外卖,需要经过接单,配餐,送餐这就是关注过程。老板,外卖员和客户就是关注对象。2.什么是类C语言中,结构体是变量的集合,在C++中结构体中不仅可以定义变量还可以定义函数。在C++中更喜原创 2021-02-28 20:47:21 · 352 阅读 · 2 评论 -
引用、内联、范围for、auto
文章目录1.引用1.1什么是引用1.2引用的特性1.3常引用1.4引用的一些使用场景1.5引用的底层实现1.6引用和指针的不同点1.引用1.1什么是引用引用不是新定义一个变量,而是给已经存在的变量取一个别名,编译器不会给引用变量开辟内存空间,它和它的引用变量共用一块内存空间。就好比一个人的绰号和名字都表示同一个人,只是称呼不一样而已。1.2引用的特性1.引用在定义时必须初始化2.一个变量可以有多个引用3.引用一旦引用一个实体,再不能引用其他实体,否则变为赋值1.3常引用引用在初始化赋值原创 2021-02-03 17:02:26 · 525 阅读 · 7 评论 -
命名空间、缺省参数、函数重载、extern C
文章目录1.命名空间1.1什么是命名空间1.2命名空间的定义1.3命名空间的使用2.缺省参数2.1什么是缺省参数2.2缺省参数的分类3.函数重载3.1什么是函数重载3.2为什么C++支持函数重载C语言不支持1.命名空间1.1什么是命名空间c++中的类和库中有大量的关键字,那么我们定义变量的时候就很容易与这些系统关键字发生冲突,使用命名空间的目的就是为了避免与关键字发生冲突;举个简单的例子,有人来学校找一个叫张三的人,广播出去后有非常多叫张三,这样就导致了混淆,不知道你要找谁。但是你如果加个前提,我要原创 2021-01-31 23:11:50 · 500 阅读 · 0 评论