自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C++IO流

在C语言中,如果想将一个整形变量的数据转化为字符串格式,如何去做呢?1.使用itoa()函数2.使用sprintf()函数都需要先给出保存结果的空间,那空间要给多大呢,这就不太好界定,但两个函数在转化时而且转化格式不匹配时,可能还会得到错误的结果甚至程序崩溃。在C++中,可以使用stringstream类对象来避开此问题,在程序中如果想要使用stringstream,必须要包含头文件<sstream>。

2025-08-08 10:10:53 848

原创 C++特殊类设计及类型转换

并且。

2025-08-08 09:58:46 745

原创 C++智能指针

什么是内存泄漏: 内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄漏的危害: 长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。//1.内存申请了忘记释放//2.异常安全问题Func();//如果Func函数抛异常会导致delete[] p3未执行,p3没被释放。

2025-08-01 17:37:39 917

原创 C++异常

实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家随意抛异常,那么外层的调用者基本就没办法玩了,所以实际中都会定义一套继承的规范体系。这样大家抛出的就都是继承的派生类对象,捕获一个基类就可以了。错误码Error Code): 是用于标识特定错误类型的数值标识符,通常由系统或库函数返回。它通过预定义的整数值或枚举类型,将错误类型标准化,便于程序通过条件判断或异常处理机制识别和处理错误‌。//服务器开发中通常使用的异常继承体系public:, _id(id){ }

2025-08-01 17:28:37 780

原创 C++11(下)(可变参数模版、lambda表达式及包装器)

则需要看这个成员是否实现了移动构造?如果实现了就调用移动构造,没有实现就调用拷贝构造。● 如果你没有自己实现移动赋值重载函数,且。

2025-07-29 09:18:46 1001

原创 C++11(上)(右值引用、移动构造)

在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了C++98称为C++11之前的最新C++标准名称。不过由于C++03(TC1)主要是对C++98标准中的漏洞进行修复,语言的核心部分并没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。从C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟。

2025-07-28 20:08:11 1240

原创 C++哈希的应用(位图、布隆过滤器)

不在。

2025-07-21 20:35:32 1171

原创 C++unordered系列的map和set类(封装)

而unordered_set类中的迭代器都是const版本的,则在封装哈希表的Insert时:unordered_set类的insert用来接收哈希表Insert的返回值,由于两个pair的迭代器是不同类型,且在迭代器中没有实现迭代器构造迭代器的构造函数,这时就会报错。对于unordered_map和unordered_set的迭代器也是通过封装哈希表的迭代器来实现,则哈希表的迭代器也要实现成一个泛型的类模板,以便能封装出普通的和const版本的迭代器,但实现起来有点麻烦!那要怎么解决这里的问题呢?

2025-07-21 19:25:06 632

原创 C++哈希(简介)

(1) unordered_map是存储<key,value>键值对的关联式容器,其允许通过key快速的索引到与其对应的value。(2) 在unordered_map中,键值通常用于唯一地标识元素,而映射值是一个对象,其内容与此键关联。键和映射值的类型可能不同。(3) 在内部,unordered_map没有对<key,value>按照任何特定的顺序排序,为了能在常数范围内找到key所对应的value,unordered_map将相同哈希值的键值对放在相同的桶中。

2025-07-15 19:43:59 1082

原创 C++map和set类(封装)

前面学习了红黑树,由于很多关联式容器的底层都是用红黑树封装的,像map、set类底层都是用的红黑树。下面我们就要用红黑树来封装出map和set类。因为map和set的底层都是用的红黑树,那意思是对于每个类都要有一个红黑树的底层逻辑吗?即🍋map(key_value模型)和set(key模型)类的封装需要写两个红黑树结构吗🍋?如果对于这两个类都要分别实现出一个红黑树结构,那就体现不出泛型编程的思想了!泛型编程就是要把本该我们程序员做的事交给编译器去做。所以我们可以将红黑树的底层逻辑封装成一个适配于map和

2025-07-15 19:42:05 750

原创 C++红黑树

红黑树也是采用三叉链,因为涉及到要找某节点的父节点和祖父节点,所以首选三叉链。//用枚举来记录标识节点的颜色enum ColorRED,BLACK//该节点的左孩子//该节点的右孩子//该节点的父节点Color _col;//该节点的颜色,_kv(kv),_col(RED){ }💡思考:在节点的定义中,为什么要将节点的默认颜色给成红色的?因为如果插入的新节点的默认颜色是黑色的,则会破坏红黑树的性质Ⅳ,每条路径都会受到影响!虽然可以调整,但是代价比较大。

2025-07-07 18:28:28 1051

原创 C++AVL树

这里开始引入学习三叉链,即每个节点除了有左右孩子指针外,还有父指针。这样能方便我们通过父指针去调节父节点的平衡因子。//该节点的左孩子//该节点的右孩子//该节点的父节点int _bf;//balance factor(平衡因子),_kv(kv),_bf(0){ }每插入一个新节点后,该新节点的平衡因子为0(因为一开始新节点并没有左右孩子)。

2025-07-07 18:26:36 812

原创 C++map和set类(简介)

set类(1) set是按照一定次序存储元素的容器。(2) 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中被修改(元素总是const),但是可以从容器中插入或删除它们。(3) 在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。(4) set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代。

2025-06-18 21:13:03 828

原创 C++二叉树进阶面试题

只是后序要倒着从后往前访问:后序倒着访问到根以后,紧接着就是右子树的根节点,然后才是左子树的根节点。●递归的子问题:就是通过前序确定根后,在中序里分隔出左右子树,则中序分割出的左子树又可以通过前序的下一个值来确定子树的根,紧接着就又是分割左右子树,这就是递归的子问题;进入到右子树后,就是迭代的子问题:即在右子树中也是先遍历左路节点,然后遍历左路节点的右子树。●递归的结束条件:通过前序确定根以后可以在中序中分割出左右子树的区间,则当递归到区间不存在时,说明左右子树已经为空,这时就递归结束。

2025-06-18 21:12:26 1019

原创 C++ 二叉搜索树

注意:当要删除的节点与其右子树的最小节点交换以后,则被删除的节点就换到了右子树中,那么删除问题就可以转换为在右子树中去递归删除该节点。由于二叉搜索树的定义是:左子树的所有节点都比根节点要小,右子树的所有节点都比根节点要大。二叉搜索树的查找较为简单,所要查找的值比根节点的键值要小,则到左子树中去继续查找,如果查找的值比根节点的键值要大,则到右子树中去查找。与上面的情况①是类似的,只不过这时要让被删除节点的双亲节点指向被删除节点的左孩子节点。如果要删除的节点就是二叉搜索树的根节点也是要做特殊处理的。

2025-06-07 13:50:56 780

原创 C++多态

多态是不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。那么在继承中要构成多态还有两个条件:🍊1.必须通过基类(父类)的指针或者引用去调用虚函数🍊2.被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写1.重载(Overloading)重载是指在同一个作用域内(通常是在同一个类中, 也可以是在全局作用域下),存在多个同名函数但它们的参数列表不同(参数的个数、类型或者顺序不同)。

2025-04-13 17:28:07 1105

原创 C++继承

继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称为派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。public:protected:// 姓名// 年龄public:protected:int _stuid;//学号protected:int _jobid;//工号/*

2025-04-13 17:26:05 702

原创 C++STL简介

STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。

2025-04-13 17:18:44 400

原创 C++模版(进阶)

一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式。🍋【优点】1. 模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生2. 增强了代码的灵活性🍊【缺陷】1. 模板会导致代码膨胀(针对不同的类型会实例化出一份类型或函数)问题,也会导致编译时间变长3. 出现模板编译错误时,错误信息非常凌乱,不易定位错误。

2025-03-18 21:48:10 1411

原创 C++反向迭代器

还需要注意的是:正向迭代器的begin()和end()作为reverse_itertor或者const_reverse_iterator的参数时,如果使用重载的- -的话可能会出现问题:比如- -end()或者end()- -做反向迭代器的参数的话,由于end()是一个Iterator类型的迭代器,并且end()是一个临时对象;跟我们自己实现的反向迭代器有所差异,它反向的rbegin()就是正向的end(),反向的rend()就是正向的begin()。那标准库中的反向迭代器是怎么实现的呢?

2025-03-18 21:47:32 976

原创 C++优先级队列priority_queue、仿函数

1.优先级队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。2.优先级队列类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先级队列中位于顶部的元素)。3.优先级队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从特定容器的“尾部“弹出,其称为优先级队列的顶部。4.底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。容器应该可以通过随机访问迭代器访问,并支持以下操作。

2025-03-18 21:45:09 1286

原创 C++stack和queue

stack的文档介绍1.stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。2.stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。3.stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下操作:○ empty:判空操作○ back:获取尾部元素操作。

2025-03-14 08:50:25 826

原创 C++list类

list的文档介绍1.list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代2.list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。3.list与forward_list非常相似: 最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。4.与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。

2025-03-14 08:49:59 967

原创 C++vector类

(1) vector是表示可变大小数组的序列容器。(2) 就像数组一样,vector也采用连续的存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。(vector其实就是顺序表(3) 本质讲,vector使用动态分配数组来存储它的元素。当新元素插入的时候,这个数组需要被重新分配大小,为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组中。

2025-03-10 21:01:43 1208

原创 C++string类

🔥在C++中,迭代器(lterator)是用于访问和遍历容器(如vector、list、map等)元素的核心工具,其本质是一个类似指针的对象,但提供了更统一的抽象接口,能够屏蔽不同容器的底层实现细节。(1) 迭代器的核心特性1.功能定义迭代器通过指针式的操作(如递增、解引用等)访问容器元素,通常支持以下基本操作:● 指向容器中的元素(类似指针)。● 通过++或 – 移动位置(支持单向或双向移动,取决于迭代器类型● 通过*操作符访问或修改元素值。2.核心作用。

2025-03-10 20:48:07 846

原创 C++模版(初阶)

class 类模板名// 类内成员定义public:_size = 0;_size++;//使用析构函数演示:在类中声明,在类外定义~Stack();//注意:类模板中函数放在类外进行定义时,需要加模板参数列表。

2025-02-27 10:43:04 633

原创 C++内存管理

因为在C语言中是没有构造和析构函数的,所以malloc/free在C++中没有办法很好的支持动态申请的自定义类型对象的初始化和清理工作。所以C++中引入了new和delete。new/delete和malloc/free最大的区别就是: new/delete对于【自定义类型】除了开空间还会调用构造函数和析构函数。int main()//自定义类型,开空间+调用构造函数初始化free(p1);

2025-02-27 10:38:15 854

原创 C++类和对象(下)

且该类没有默认构造函数时。

2025-02-24 15:11:43 977

原创 C++类和对象(中)

无参。

2025-02-24 15:11:22 1422

原创 C++类和对象(上)

/类体:由成员函数和成员变量组成//一定要注意后面的分号class为定义类的关键字,ClassName为类的名字(自定义),{}中为类的主体,注意类定义结束时后面的分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。类的两种定义方式:1.声明和定义全部放在类体中,需注意: 成员函数如果在类中定义,编译器可能会将其当成内联函数处理。2.类声明放在.h文件中,成员函数的定义放在.cpp文件中。

2025-02-24 15:09:12 789

原创 C++入门(关键字、命名空间、输入输出、缺省参数等)

定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字(自定义),然后接一对{}即可,{}中即为命名空间的成员。//1.正常的命名空间定义//S是命名空间的名字,一般开发中使用项目名字做命名空间名//命名空间中可以定义变量/函数/类型int val;//2.命名空间可以嵌套//test.cppint a;int b;int c;int d;//3.同一个工程中允许存在多个相同名称的命名空间//编译器最后会合成在同一个命名空间中。

2025-02-16 15:39:24 949

原创 启程C++

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

2025-02-16 15:38:45 909

原创 排序--四种算法

希尔排序的时间复杂度不好计算,因为 gap 的取值很多,导致很难去计算,因此很多书中给出的希尔排序的时间复杂度都不固定。

2025-02-13 10:54:25 1348

原创 数据结构-二叉树经典OJ题

🍃输入型参数:在函数调用时传递给函数的值,不应在函数内部被修改。🍃输出型参数:通过指针传递变量的地址,函数内部可以修改这个变量的值,从而影响函数外部的变量。这在需要从函数返回多个值或者需要修改外部变量时非常有用。理解这两种参数的差异和用法对于编写高效、清晰的C语言代码至关重要。

2025-02-13 10:54:02 1172

原创 数据结构-链式二叉树

计算二叉树第K层的节点,这里需要加入一个参数k才能实现,因为我们不知道递归什么时候会到达第k层,所以传一个参数k,让它每递推一次就递减1,若根节点为第一层,则k递减到1就到达第k层了(递推终止条件)。设二叉树的根结点所在层数为1,层序遍历就是从所在二叉树的根结点出发,首先访问第一层的树根结点,然后从左到右访问第2层上的结点,接着是第三层的结点,以此类推;没有孩子节点的节点就是叶子节点,所以递推结束的条件就是:该节点的左右子树为空就返回1,即把该叶子节点的数量计上。而一开始的判空其实针对对根节点而言的。

2025-02-12 19:23:49 1241

原创 数据结构-二叉树-堆

◆。

2025-02-12 19:19:26 1137

原创 数据结构-栈&队列OJ题

MyStack的成员不是队列指针,而是队列结构体变量,所以在myStackCreake中为MyStack动态开辟的空间大小是为两个队列结构体变量开辟的,这样做的好处是可以取q1和q2的地址,方便我们直接可以修改队列q1和q2。此时再入数据就要从rear的位置入,问题是入了数据后,rear+1就出了数组的下标范围,我们应该让rear回到0下标的位置才能真正实现循环队列:(注意:k是题目要求存储的元素个数)这道题是要用队列来实现栈,首先我们要了解到队列的性质是先进先出,而栈的性质是后进先出。

2025-01-17 17:48:25 2723

原创 数据结构-栈和队列

inttop;//空间容量}ST;arr就是待开辟空间的指针。top可以有两种选择:一种是指向栈顶元素,另一种就是指向栈顶元素的下一个位置。STst;//1.节点结构}QNode;//2.队列结构intsize;}Queue;队列的结构中只有三个成员,phead是用来指向链表的头的,ptail是用来指向链表的尾的。因为队列是先进先出的特点,所以链式队列是在队头出数据,在队尾进数据。有了phead和ptail指针就方便我们管理链表。size是链表的元素个数(节点个数)。

2025-01-17 17:09:13 1236

原创 数据结构-顺序表&链表经典OJ题

●。

2025-01-15 19:09:29 1795

原创 数据结构-顺序表及链表结构分析

但是需要注意:由于链表中至少是有哨兵位节点的,所以pos位置理论上是不会找到头结点的,因为LTFind函数是自己封装的,自己能清楚地知道能不能找到某个节点位置,且不会找到哨兵位节点,因为在LTFind函数里断言过不能找哨兵位这个节点。注意:在删除pos节点后面的节点时,pos节点的下一个节点不能是哨兵位,不能删除链表中的哨兵位节点。在指定位置插入数据,即在指定数据的前面插入数据,也要涉及挪动数据,比如上面图:在下标为2的位置插入一个数据,就要把pos位置及以后的数据整体往后挪一位,需要注意循环的结束条件。

2025-01-15 18:55:12 948

空空如也

空空如也

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

TA关注的人

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