C++
文章平均质量分 86
关于C++
明月本无心
Github链接:https://github.com/bailin048
展开
-
浅谈定位new
之前在C++内存管理初探一文中谈到 C++ 内存管理存在比 C 中malloc/free一族函数更好用的new与delete。常规new的使用方法相信已经介绍比较清楚明晰了,今天本文尝试讲解一下定位new的使用规则。定位new(placement-new)定位new表达式时在已分配的原始内存空间中调用构造函数初始化一个对象。换句话说就是,现在空间已经有了,不需要定位new像常规new一样去给申请空间,只需要定位new在已有的空间上调用构造函数构造对象而已。定位new的使用格式:1.new (plac原创 2021-11-03 17:07:56 · 2513 阅读 · 0 评论 -
K个一组反转链表
K个一组反转链表给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。题目解析1.k个一组分别翻转,这就要我们要能对链表进行分组,每组是k个节点,各组单独翻转,意味着每组的翻转是组内行为,不可影响到别组,我在此处使用键值对pair将每组翻转前的头结点及尾结点存储起来2.需要注意的是若节点总数不是k的倍数,多出的节点不翻转,那么需要设一个标志,标明存不存在不需要翻转的组原创 2021-10-25 11:30:54 · 1829 阅读 · 0 评论 -
散列hash
散列hash散列哈希冲突hash函数的构造方法1.除留余数法2. 数字分析法3.平方取中法处理冲突的方法1.开放地址法a.线性探测再散列b.二次探测再散列c.随机探测再散列线性探测散列表模拟2.链地址法链地址法散列表模拟结语散列散列方法是一种计算式查找方法,又叫做hash(哈希)法或关键字地址计算。其基本思想是:首先在记录的关键字key和记录的存储位置p之间建立一个对应关系H,使得p=H(key),H称为hash函数,p称为散列地址。当创建hash表时,把关键字为key的记录直接存入地址为H(key原创 2021-07-08 14:48:39 · 1272 阅读 · 0 评论 -
map与set
map与set引言mapmap的主要常用方法模拟实现setset的主要常用方法模拟实现map与set的类似容器对比模拟实现引言这篇文章里介绍的东西都是STL的容器,包括map/set/unordered_map/unordered_set/multimap/multiset.上述容器中map与set的底层结构是带有迭代器的红黑树,其他容器的底层结构都是采用 链地址法实现的哈希表。mapmap的功能是将键值对形式的数据存储起来,建立一对一的映射关系,其底层结构为红黑树,这意味着数据是有序的。键值对原创 2021-07-08 10:12:28 · 126 阅读 · 0 评论 -
布隆过滤器
布隆过滤器布隆过滤器是布隆于1970年提出的一种紧凑型、比较巧妙的概率型数据结构,其特点是高效的地插入与查询,可用来表示某样东西一定不存在或者可能存在。布隆过滤器是通过使用多个哈希函数,将同一个数据映射到位图结构中,这种方式不仅可以提高查询效率,也可以节省大量的内存空间。布隆过滤器能干什么?小伙伴们有没有注意过像腾讯视频、抖音、bilibili等app在你手机通知栏里对你的推送?推送一条后,你点进去看了或者清除掉后,等会它又推送一条,这一条一定和之前的推送不一样,甚至从被安装到被卸载都没有推原创 2021-07-07 20:06:34 · 538 阅读 · 0 评论 -
简述位图C/C++
位图位图的概念位图的简单使用示意位图的应用位图的实现位图的概念所谓位图,就是使用比特位表示数据存在与否的一种数据结构,1个比特位表示一个数据的状态(存在/不存在)。而一个字节有8个比特这就意味着一个字节就可以表示8个数据的状态,这将大大节省保存数据的空间。例如,我要保存1-16这16的数字,通常的做法是申请16个整型空间,将其存储起来,这需要16*4=64个字节的空间。而如果使用位图,则只需要2的字节即可:2个字节有16个比特,每个比特有两种状态(0/1),则16个比特就可以表示这16个整型数字。但原创 2021-07-07 17:42:59 · 479 阅读 · 0 评论 -
AVL树的删除
引言AVL树的定义及性质及其重要的插入方法,我已在AVL树的插入一文中详细阐述过了,其中重要的旋转也已进行详细描述。本文就不再赘述了,直接使用,要是不清楚的小伙伴,还请移步AVL树的插入再回头复习一下下。AVL树的删除AVL树的删除步骤如下:寻找删除目标(存不存在,定位出目标)判断删除目标的类型,使用转换的思路,将其转化为删除叶子将删除目标与AVL树链接断开,调整平衡,完成删除寻找删除目标寻找删除目标的思路很简单,因AVL树也属于BST,因此寻找目标的做法与BST的删除思路基本一致。原创 2021-07-05 21:11:29 · 5483 阅读 · 8 评论 -
带你一探红黑树的究竟
前言前不久写了二叉搜索树BST与高度平衡的AVL树的插入与删除无论是BST还是AVL树,树的中序遍历结果都是有序的,这是二叉搜索树的根本性质。不过AVL树比BST性能更上一层,因为AVL树在保持BST性质的同时,也保证树的高度是平衡的(左右子树高度喜相差不大于1)。有了BST与AVL树的基础,我们今天来搞红黑树RBTree!那么红黑树是什么?红黑树红黑树也是二叉搜索树,不同于AVL,红黑树在树的每个节点上增加了一个颜色标志,用于表示节点的颜色(RED or BLACK)。红黑树通过对任何一条从根到原创 2021-05-31 22:19:46 · 796 阅读 · 4 评论 -
AVL树的插入
什么是AVL树?AVL树又称为高度平衡的二叉搜索树。一棵AVL树如果不是空树,则符合以下性质:1.左子树与右子树的高度之差的绝对值不超过12.左右子树均是AVL树易知,二叉搜索树可以将查询效率提高至O(logh),h为二叉搜索树的高度。但当数据的插入是严格有序时,二叉搜索的效率会恶化至O(n),即线性复杂度。如下,有一组数据:不可否认,这还真是一棵二叉搜索树,但这棵树好嘛?不好!为什么不好?当我们想要查找数据时,查询路径和遍历查数组有什么区别?没有区别!都是线性复杂度。所以,两个俄罗斯数学家原创 2021-05-22 15:27:23 · 4706 阅读 · 0 评论 -
删除BST的节点
BST是什么?二叉搜索树BST(Binary Search Tree),又称为二叉排序树。该树要么是一个空树,要么具有以下性质:序号BST的性质1左树不空,则左树中所有节点中的值都小于根节点的值2右树不空,则右树中所有节点中的值都大于根节点的值3左右子树也是BST下图中的树便是一棵BST:BST的节点插入创建二叉搜索树比较简单,首先我们定义出二叉搜索树的节点类模板BSTNode,该类应具有三个成员,分别是左孩子指针leftchild,右孩子指针righ原创 2021-05-18 15:12:39 · 1905 阅读 · 3 评论 -
C++继承
继承是什么?继承机制是面向对象程序设计实现代码复用的重要手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能。采用继承手段生成的类称为派生类继承呈现了面对想对象程序设计的层次结构,体现了由简单到复杂的认知过程。继承使=是类设计层次的复用。为什么需要继承?假设现在不存在继承机制,现在我们实现了一个person类,这个类中含有人的一切属性及行为。我们现在想就人生阶段来实现对person的详细划分,处于不同人生阶段的人有不同的事情需要做,在实现时,即不同阶段的人有不同的方法及一些属性。如原创 2021-05-09 21:48:05 · 364 阅读 · 0 评论 -
模拟stack/queue/priority_queue
stack要点1.stack遵从先进后出的规则,即先进栈的元素后出栈,入栈/出栈只能在栈的一端进行2.stack是作为容器适配器被实现的,容器适配器是对特定类进行封装,作为其底层的容器3.stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器应支持如下操作:·empty()——判空·back()——获取尾部元素·push_back()——尾部插入·pop_back()——尾部删除4.标准容器vector、deque、list均符合第3条要求,默认情况下,使用dequ原创 2021-04-20 09:46:04 · 112 阅读 · 0 评论 -
迭代器失效(list/vector)
什么是迭代器迭代器是一种面向对象的广义指针,用于指向容器中或流中的对象。可以看做是一种指向数据的指针。何谓迭代器失效迭代器失效是一种现象,由特定操作引发,这些特定操作对容器进行操作,使得迭代器不指向容器内的任何元素,或者使得迭代器指向的容器元素发生了改变。【No`te】后一种取决于编译器,部分编译器会将此种情况也视为迭代器失效,部分编译器并不视为失效)可能引起迭代器失效的操作因为不同的容器,迭代器不尽相同。可以引起list迭代器失效的相同操作不一定会导致vector的迭代器失效可能原创 2021-04-06 18:05:54 · 2765 阅读 · 5 评论 -
模板初识~
模板是实现泛型编程的基础,泛型编程即指编写与类型无关的逻辑代码,是实现复用的一种手段。模板可分为:函数模板,类模板函数模板概念函数模板代表了一个函数族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。函数模板格式template<typename T1,typename T2,……,typename Tn>返回值类型 函数名(形参列表){函数体}如:template<typename T>void Swap(T& left,T原创 2021-03-31 10:27:21 · 1248 阅读 · 6 评论 -
深浅拷贝~
深浅拷贝初识先吃一个栗子:#include <iostream>#include <string.h>#pragma warning(disable:4996)using namespace std;char* ShallowCopy(char* src) { char* dst = src; return dst;}char* DeepCopy(char* src) { char* dst = new char[strlen(src) + 1]; str原创 2021-03-28 18:54:32 · 220 阅读 · 0 评论 -
C++内存管理初探
C/C++中程序中内存区域简单划分及介绍内核空间:存放内核代码和数据的空间,提供给内核使用栈(堆栈):存储非静态局部变量/实例化后的形参/返回值等等数据的空间,栈向下增长(即从高地址处向低地址处生长)内存映射段:用于高效映射I/O映射,装载共享动态库的空间。用户可使用系统接口创建共享内存,做进程间通信堆:在程序运行时用于动态分配的空间,堆向上增长数据段:存储全局数据与静态(static)数据,程序结束时由系统释放代码段:可执行的代码/只读常量...原创 2021-03-22 22:24:14 · 1130 阅读 · 9 评论 -
实现日期类:日期+天数/日期-天数/根据日期算星期几
实现要求1.可以任意构造一个日期对象2.允许日期对象进行自加,自减(前&后)3.日期对象前进/倒退任意天数可以得到另一个日期4.两日期之间可以计算相差天数5.允许两日期之间进行大小比较(>,<,>=,<=,==,!=)6.可以得到任意输入某年某月的天数需要编写的公有函数1.默认构造函数2.拷贝构造函数3.析构函数4.赋值重载函数5.减法重载函数【2个】6.加法重载函数7.比较运算符重载函数【6个】8.++重载函数【2个】,–重载函数【2个】实现原创 2021-03-16 08:54:23 · 663 阅读 · 1 评论 -
构造函数初探-C++
定义每个类都分别定义了它的对象被初始化的方式,类通过一个或多个特殊的函数控制其对象的初始化过程,而这些函数称为构造函数(constructor)。构造函数的任务:初始化类对象的数据成员构造函数被调用的时机:无论何时只要类的对象被创建,构造函数就会被调用。特征1.构造函数的名字和类名相同2.无返回类型,无返回值3.不能被声明为const型:当我们在创建一个const对象时,直至构造函数完成初始化过程,对象才真正意义上获得其“常量”属性。因此,构造函数在const对象的构造过程中可以向其写值4.原创 2021-03-10 10:23:07 · 907 阅读 · 6 评论