自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(56)
  • 收藏
  • 关注

原创 【C++】类型转换

在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化,C语言中总共有两种形式的类型转换:隐式类型转换和显式类型转换。因此C++提出了自己的类型转化风格,因为C++要兼容C语言,所以C++中还可以使用C语言的转化风格。转换的可视性比较差,所有的转换形式都是以一种相同形式书写,难以跟踪错误的转换。,因为而它们之间的转换可能是不安全的,此时需要用到。注意:注意虽然指针也是内置类型,但是。

2024-01-22 15:54:22 987

原创 【C++】特殊类设计

由于new是由两部分组成,operator new + 构造(拷贝构造),其中operator new是一个全局函数,可以在类中对它重载一个该类专属的operator new,若重载了,new该类对象时就不会去调用全局,而是去调用类中的,既然在类中又可以将其声明为删除函数,这样new就无法调用operator new了,进而无法在堆上创建对象了。定义GC类和GC类的全局对象gc,当进程结束时,gc的生命周期也结束了,然后它会调用它的析构函数,函数内部刚好完成了对单例对象的释放工作。

2024-01-21 23:53:38 1042

原创 【C++】智能指针

借此,实际上把管理一份资源的责任托管给了一个对象。

2024-01-21 18:06:59 1121

原创 【C++】异常

实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家随意抛异常,那么外层的调用者基本就没办法玩了,所以实际中都会定义一套继承的规范体系。public:, _id(id){}//声明为虚函数//共有属性protected:int _id;public:{}//派生类根据实际需求重写基类的虚函数return str;//新增独有成员private://...其它子类。

2024-01-20 16:21:04 1078

原创 【C++11】部分新特性

临时对象是右值,因此会调用移动赋值,而这个临时对象的生命周期只有它所在的那一行,也就是说花费了一次深拷贝的代价结果就只有这一行有效,紧接着就会被销毁,这样就太浪费了,又因为这个临时对象里面的数据就是ret想要的,因此可以直接交换它的成员来达到减少拷贝的目的。假设使用某个默认的函数,但是因为一些原因这个函数没有默认生成。可以理解为是一个常量数组,括号里面的数据存储在常量区,不管存放多少数据,它所占空间的大小始终是8/16字节,因此不难推断该类中的成员包含两个指针,分别指向这块空间的开始的结束位置。

2024-01-17 10:23:25 953

原创 哈希扩展:位图与布隆过滤器

随机给40亿个不重复的无符号整数,再给一个无符号整数,如何快速判断这个数是否在这40亿个数中?

2023-12-17 00:33:09 86

原创 哈希-unordered系列关联式容器

深入理解unordered系列容器底层的数据结构哈希表

2023-12-04 15:36:50 111

原创 map/set封装

会导致类型不匹配,这是因为树的insert返回值pair中的迭代器类型是普通迭代器,而set中的迭代器的类型是const类型,普通迭代器无法构造const迭代器,所以会报错,解决方法为:设计一个支持普通迭代器转化为cons迭代器的构造函数。对于实例化const迭代器类型的模板类而言,该函数是构造函数,而对于实例化普通迭代器类型的模板类而言,该函数是拷贝构造,通过该函数即可解决上述问题。set是K模型,因此key_type是Key,value_type也是Key,实例化后树中要存储的元素类型也是Key类型。

2023-11-14 20:29:43 107

原创 红黑树-RBTree

红黑树的概念以及大致插入过程

2023-11-11 21:52:26 660

原创 二叉平衡搜索树-AVL树

主要分析平衡树的插入过程

2023-11-06 18:39:42 132

原创 二叉搜索树-BST

之所以称之为搜索树是因为该树非常适合用来查找某些元素,比如以上图为例,若要查找元素6,先和根节点的值5进行比较,比5大则可以直接去它的右子树中去找,因为左子树都比5小一定查找不到,然后重复上述操作,直到查到或者到空。K/V模型,每一个关键字K都对应一个值V,即的键值对,这种结构的实现与第一种基本无异,只是在存储K的同时顺带存储V即可,使用两个栈分别保存从根节点到目标节点路径中的每个节点,由于题目保证树中一定存在目标节点,因此两个栈里保存的路径节点中一定有它们的公共祖先。

2023-10-22 18:16:04 216 2

原创 【C++】多态

多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。继承是多态的前提条件必须通过父类的指针或者引用调用虚函数被调用的函数必须是虚函数,且子类必须对父类的虚函数进行重写重载:两个函数在同一个作用域,函数名相同但参数不同(个数、类型、类型顺序)。覆盖(重写):两个函数分别在父子类域中,且函数名、参数列表和返回值全都相同(协变除外),两个函数还都得是虚函数。

2023-09-14 23:32:25 375

原创 【C++】继承

若要设计一个学校中不同人员的身份管理系统,首先需要将其身份信息数据提取出来封装成一个类,比如:不难发现,每个类中都包含了一些公共的属性信息,后续还有一些类要包含这些属性,写起来非常麻烦,而且后续需要修改这些公有属性的话每个类都要一起改,可维护性和可扩展性比较低,针对这种情况,C++设计出了继承。//基类(父类)public:protected:// 公有属性//派生类(子类)public:private://独有属性int _stuid;// 学号//...

2023-09-04 09:18:05 294 1

原创 【C++】模板进阶

前面介绍过,C++中的模板是泛型编程的基础,允许以一种通用的方式编写代码,并且无关具体的类型,只有在使用时传递参数被编译器实例化,根据实参类型产生函数或者类模板的特定类型版本。模板的出现,让本该自己写的一些重复的代码全都交给编译器去自动生成【优点】模板复用了代码,节省资源,提高开发,C++的标准模板库(STL)因此而产生增强了代码的灵活性,比如适配器、仿函数等【缺陷】模板会导致代码膨胀问题,也会导致编译时间变长出现模板编译错误时,错误信息非常凌乱,不易定位错误。

2023-08-20 13:15:28 249

原创 【C++】stack/queue/优先级队列的模拟实现

deque(双端队列)容器不仅支持头部和尾部数据的插入和删除,也支持随机存取、访问和修改(迭代器),但是每个方面的功能又不是特别突出,尤其是随机存取和中间位置插入删除数据,效率比较低,因此很少单独使用deque,而且将其作为某个容器的适配器。默认实现的是大堆,因为比较那里写死了,若要实现小堆结构则需要修改向下和向上调整算法的比较逻辑,但实际上库里实现的优先级队列是没办法修改的,所以真正的做法是。它是一种特殊的容器类型,通过封装已有的容器类型来提供特定功能的接口函数,以满足不同的需求。,来实现大小堆的切换。

2023-08-19 14:18:58 291 1

原创 【C++】list的模拟实现

list是一个顺序表,底层采用双向带头循环链表实现,支持常量时间的插入删除操作,不同于vector无法随机访问。list文档说明。

2023-08-17 22:48:08 507

原创 【C++】vector的模拟实现

vector是一个空间可以动态增长的数组。vector文档说明。

2023-08-14 21:00:05 216

原创 【C++】string的模拟实现

string类的增删查改

2023-08-12 01:24:20 221

原创 【C++】模板

template < class T1 , class T2 , . . . , class Tn > class 类模板名 {// 类内成员定义 };// 类模板 template < class T > class Stack {public :// 其他方法... ~ Stack() {_size = 0;T * _array;int _size;这里的Stack。

2023-08-07 14:20:25 100

原创 【C++】内存管理

new和malloc除了写法上区别较大,对于内置类型的处理区别不是很大,其实真正体现new和delete的价值的地方在于自定义类型。free(p1);delete p2;return 0;输出结果:可以发现的是,malloc和free只是单纯地开辟和释放空间,而new和delete不仅会开辟和释放空间,并且还会自动去调用该类的(默认)构造和析构函数,这是malloc和free。

2023-08-05 17:43:07 471

原创 【C++】类和对象 - 下

(且该类没有默认构造时)。对于自定义类型成员变量,一定会先使用初始化列表初始化。对于。

2023-08-05 10:05:58 878

原创 【C++】类和对象 - 中

类中六大默认成员函数分别是...

2023-08-02 15:07:04 290

原创 【C++】类和对象 - 上

C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。而C++则...

2023-07-30 14:01:36 360

原创 【C++】入门

C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机,20世纪80年代,计算机界提出了OOP(object orientedprogramming:面向对象)思想,支持面向对象的程序设计语言应运而生。1982年,BjarneStroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言。为了表达该语言与C语言的渊源关系,命名为C++。

2023-04-28 18:01:12 1316 1

原创 关于函数栈帧的创建与销毁和可变参数列表

什么是函数栈帧?函数调用时在汇编层面下具体是怎么做的?如何间接篡改形参数据、间接调用函数以及如何使用可变参数列表?以上问题在本篇文章中均有详细地探究。

2023-04-20 13:18:03 339

原创 【C深度剖析】关键字大全详解 - 2

数据类型的作用之一是可以用来定义变量,在内存当中开辟一定大小的空间然后存放数据,读取数据时,在以自身的数据类型来解释该数据,这是对于数据类型的部分理解。问题是void类型可以定义变量吗?

2023-03-30 02:18:55 585

原创 【C深度剖析】关键字大全详解 - 1

本文是的主要目的是去剖析程序与计算机基本结构之间的关联和之前在学习C语言中提到过但没有去深入了解过的一些关键字。

2023-03-21 22:57:39 783

原创 归并排序 - 递归与非递归实现

归并的缺点在于需要O(N)的空间复杂度,归并排序的思考更多的是解决在磁盘中的外排序问题。时间复杂度:O(N*logN)空间复杂度:O(N)稳定性:稳定。

2022-09-17 20:35:31 683 3

原创 快速排序的三种单趟排序思想的实现与优化 - 递归与非递归

快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,大厂也喜欢考,所以快排必须理解并掌握。快速排序yyds,它的三种递归和非递归的思想都要理解并可以手撕其中一种思想的代码实现。

2022-09-14 23:37:03 674

原创 插入、希尔与选择排序

元素集合越接近有序,直接插入排序算法的时间效率越高时间复杂度:O(N^2)空间复杂度:O(1),它是一种稳定的排序算法稳定性:稳定希尔排序是对直接插入排序的优化。当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。

2022-09-12 20:57:06 301 1

原创 二叉树正传 - 二叉树的基本操作及构建

二叉树前传。本篇会着重介绍二叉树的操作,了解二叉树的前中后序遍历以及链式二叉树的构建。二叉树的概念以及基础操作到此就结束了,二叉树的递归操作都是基于这几种遍历的变形,所以遍历二叉树要十分熟练,以及要想清楚层层递归的大概逻辑。相较于前面的链表啥的难多了感觉。

2022-09-09 18:33:20 802 2

原创 堆的应用:堆排序及TopK问题

前一篇文章介绍了堆的概念及结构和堆的实现,堆的物理结构是数组实现的,但是要把它的逻辑结构想象成完全二叉树,并且了解到堆的增删数据后还要保持其原来的结构,因此需要采用向上和向下调整算法,最多调整该二叉树的高度(logN )次。堆的的本质是方便找出次大或者次小的数,因此本文来介绍第一次接触到的时间复杂度为O(N*logN)的排序:堆排,以及利用堆排思想来解决TopK问题。即求出一组数据中前K个最大的元素或者最小的元素,一般情况下数据量都比较大。

2022-09-03 16:37:58 672 1

原创 二叉树前传 - 树与堆的概念结构及堆的实现

前面学习过的顺序表链表等都是线性表(结构),逻辑结构上数据是诶个存储的,呈现出一条线性。而今天要了解的树就不再是一种线性结构了。

2022-08-18 00:42:21 468 17

原创 我幼儿园的弟看了都直呼简单的【栈和队列】

栈:一种特殊的线性表(在逻辑上是连续存储的,物理上不一定连续),其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。例如上面在栈中的数据只能先依次拿出栈顶的数据,出栈的顺序依此是4,3,2,1,入栈时是1,2,3,4,所以后进先出也可以理解为先进后出。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除操作叫做出栈,出数据也在栈顶。栈的实现一般可以使用数组或

2022-08-14 21:40:06 425 6

原创 【数据结构】万字链表详解

概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。换句话说,分散存储是链表最显著的特征,为了能够保持数据元素间的顺序关系,在创建每个元素的同时都要配备一个指针,用于指向它的后继元素。这样由指针相互连接的数据就具有了线性的关联。链表中的数据有俩个部分组成:一是本身存储的数据信息,二是指向后继元素的指针。这两部分组成数据元素的存储结构称为链表的结点,所有的节点通过指针相互链接就组成了一个链表。可以按需申请和释放不存在扩容的问题。...

2022-08-09 18:43:33 861 7

原创 【数据结构与算法】时空复杂度的计算

数据结构(DataStructure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。简言之就是在内存中管理数据–增删查改数据结构和数据库的区别是什么?这二者都是管理数据,只不过数据库是在磁盘中管理数据–增删查改,而数据结构是在内存中管理数据。磁盘空间很大,内存很小,如果数据量大则在磁盘中用数据库来管理,而数据量小则可以在内存中使用数据结构来管理。它们最重要的区别是磁盘可以不带电永久存储数据,而内存一旦断电数据全部消失,内存只是临时来存放这些数据。...

2022-07-29 16:30:45 800 1

原创 【C语言】程序环境和预处理操作

_FILE__//进行编译的源文件__LINE__//文件当前的行号__DATE__//文件被编译的日期__TIME__//文件被编译的时间__STDC__//如果编译器遵循ANSIC,其值为1,否则未定义这些预定义符号都是语言内置的。i

2022-07-20 23:40:20 405 1

原创 【C语言】文件操作

磁盘上的文件是文件。程序文件包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe)。数据文件文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。...

2022-07-18 22:20:55 396

原创 【C语言】动态内存管理 - malloc等函数详解

/返回类型void*指针,参数要开辟空间的字节数void*malloc(size_tsize);这个函数向内存申请一块连续可用的空间,并返回指向这块空间的起始字节的地址。如果开辟成功,则返回一个指向开辟好空间的指针。如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。返回值的类型是void*,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。如果参数size为0,malloc的行为是标准是未定义的,取决于编译器。;...

2022-07-16 21:59:16 4020 1

原创 【C语言】自定义类型 - 下:枚举、联合

枚举顾名思义就是一一列举。把可能的取值一一列举。比如我们现实生活中:这里就可以使用枚举了。以上定义的 enum Day , enum Color 都是枚举类型。{ }中的内容是枚举类型的可能取值,也叫 枚举常量 。这些可能取值都是有值的,默认从0开始,一次递增1。当然在定义的时候也可以赋初值。例如:1.2 枚举的优点可以使用 #define 定义常量,为什么非要使用枚举?枚举的优点:2. 联合 (共用体)之所以称为联合体是因为:这种类型定义的变量也包含一系列的成员,但是不同于其他自定义类型

2022-07-14 15:54:22 127

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除