自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C++进阶 -- set、map、multiset、multimap的介绍及使用

本文系统介绍了C++ STL中的关联式容器,包括set、map、multiset和multimap。关联式容器以键值对形式存储数据,相比序列式容器具有更高效的数据检索能力。文章详细解析了键值对结构pair的定义和使用方法,以及各类关联式容器的特点:set存储唯一值,multiset允许重复值;map存储唯一的key-value对,multimap允许key重复。同时介绍了这些容器的常用操作,如插入、查找、删除等,并对比了不同容器在底层实现(红黑树)和功能特性上的差异。

2025-11-14 16:39:39 689

原创 C++进阶--二叉搜索树

本文介绍了二叉搜索树的定义、实现及应用。首先阐述了二叉搜索树的基本概念和性质,即中序遍历后有序。详细讲解了二叉搜索树的实现,包括结点结构、构造函数、查找、插入、删除等核心操作的代码实现。重点分析了删除操作的四种情况及其处理方式,并解释了替换删除法的原理。最后讨论了二叉搜索树的性能特点,指出其查找效率与树的深度密切相关,且相同元素的不同插入顺序会导致不同的树形结构。二叉搜索树为后续map和set的实现提供了重要基础。

2025-11-11 16:01:41 660

原创 C++中的IO流

本文主要介绍了C/C++中的输入输出流机制。在C语言中,通过scanf()和printf()实现标准输入输出,利用缓冲区提高可移植性并支持"行"读取概念。C++通过流类库实现了更强大的IO功能,包括cin/cout标准流以及文件流操作,支持文本和二进制格式。文章详细讲解了文件读写步骤、stringstream类的数值转换和字符串拼接功能,并比较了C与C++在IO处理上的差异,强调了类型安全和缓冲区管理等注意事项,为程序设计提供了全面的IO操作指南。

2025-11-10 14:43:24 986

原创 C++ 多态

本文深入探讨了C++多态的核心概念与实现机制。首先阐述了多态的基本概念,即不同对象调用相同函数产生不同行为,并通过票务购买示例加以说明。文章详细分析了构成多态的两个必要条件:通过基类指针/引用调用虚函数,以及派生类必须重写基类虚函数。重点讲解了虚函数表(vtable)的工作原理,包括单继承和多继承场景下的虚表构建过程。文章还探讨了虚函数重写的特殊情况(协变和析构函数重写)、抽象类与接口继承的关系,以及C++11新增的override和final关键字。揭示了静态绑定与动态绑定的本质区别。

2025-11-07 17:04:20 981

原创 C++ 继承

本文系统介绍了面向对象编程中的继承机制。主要内容包括:1)继承的基本概念和定义,展示派生类如何复用基类成员;2)基类与派生类对象的赋值转换规则,解释"切片"现象;3)继承中的作用域问题及同名成员处理;4)派生类默认成员函数的特殊处理方式;5)菱形继承问题及其解决方案(虚拟继承);6)继承与组合的选择建议。文章通过代码示例详细说明了各种继承场景下的处理方式,特别分析了虚拟继承解决菱形继承问题的原理,指出多继承可能带来的复杂性,并建议在设计中优先考虑组合方式以降低耦合度。

2025-10-31 11:09:31 1588

原创 C++模板进阶操作 -- 非类型模板参数、模板的特化及模板的分离编译

本文介绍了C++模板的关键概念与应用。重点讨论了非类型模板参数,其只能使用整型常量在编译期确定值,可用于创建不同长度的静态数组。通过日期类比较案例,解释了模板特化的必要性,包括函数模板特化和类模板特化(全特化与偏特化)。最后分析了模板分离编译失败的原因:定义文件未实例化而调用文件缺少定义,推荐将声明和定义放在同一文件避免该问题。模板虽能提高代码复用性,但会导致代码膨胀和编译时间增长,错误信息也难以定位。

2025-10-30 08:00:00 1275

原创 C++初阶 -- stack && queue && priority_queue的模拟实现

摘要:容器适配器是一种将类接口转换为客户所需接口的设计模式。stack和queue默认使用deque作为底层容器,但可通过模板参数指定其他容器(如vector或list),只要该容器支持基本操作(push、pop等)。priority_queue默认使用vector并实现堆结构,通过仿函数(如Less、Greater)控制大小根堆。文章详细展示了三种容器适配器的模拟实现,包括成员函数、底层容器选择及堆调整算法,体现了适配器模式的灵活性和通用性。

2025-10-29 08:00:00 801

原创 C++初阶 -- stack && queue && priority_queue的使用

C++ STL容器适配器使用摘要:stack默认使用deque容器,支持push/pop/top操作;queue默认使用deque,支持push/pop/front/back操作;priority_queue默认使用vector实现大根堆,可通过greater<int>实现小根堆。三种适配器都提供empty()和size()方法,其中stack是LIFO结构,queue是FIFO结构,priority_queue按优先级排序。使用时可通过模板参数指定底层容器类型。

2025-10-28 08:00:00 195

原创 C++初阶 -- 模拟实现list

本文分析了STL中list容器的底层实现原理及其模拟实现。list底层采用带头双向循环链表结构,每个节点包含前驱指针、后继指针和数据变量。重点探讨了迭代器的封装实现,由于list节点空间不连续,需通过类封装重载运算符来模拟连续空间访问行为。详细介绍了构造函数、拷贝构造、析构函数等核心成员函数的实现逻辑,包括迭代器类模板参数设计、运算符重载原理,以及插入删除等操作的具体实现方法。文章通过代码示例展示了如何模拟实现一个完整的list容器,包括节点结构、迭代器封装和各类成员函数的设计思路。

2025-10-27 16:33:56 1154

原创 C++初阶 —— list容器接口详解

本文介绍了C++ STL中的list容器及其常用接口。list是一种基于双向链表实现的序列容器,支持高效的元素插入和删除(O(1)时间复杂度),但不支持随机访问。文章详细说明了list的构造函数、迭代器使用,以及各种成员函数如empty/size、front/back、push/pop操作、insert/erase等。特别介绍了list特有的操作如splice、reverse、merge、unique和sort,并解释了list::sort与算法库sort的区别(链表迭代器不能相减,list使用归并排序)。

2025-10-24 16:44:16 387

原创 C++初阶 -- Vector的模拟实现

本文详细介绍了STL中vector容器的实现原理与接口设计。vector是一个类模板,通过原生指针实现迭代器功能。其核心成员包括三个指针:_start(容器头)、_finish(有效数据尾)和_endofstorage(容器尾)。文章重点分析了构造函数、拷贝构造、析构函数等默认成员函数的实现,特别强调了深拷贝与浅拷贝的区别及解决方案。同时还介绍了容量管理(reserve/resize)、内容修改(push_back/pop_back/insert/erase)和访问接口(operator[])的实现方法,并

2025-10-24 15:30:39 872

原创 论坛系统测试报告

在Chrome浏览器和edge浏览器下打开论坛系统并没多大差别,只是在edge上打开页面的大小比在Chrome上打开页面的大小大一些。

2025-03-26 13:50:19 860

原创 博客系统性能测试

想要做一个属于自己的来存储私人博客的项目。基于。只要登录就可以查看并修改自己的博客,其他用户的博客只能查看。但是该项目没有实现用户注册的功能,只能通过在数据库中存储的用户数据来进行校验登录并且用户的头像不能自己设定。用户的文章数量以及文章类型也是静态设定好的并不能直接修改。通过使用selenium工具来定位到web中的元素,对获取到的元素进行自动化测试等操作。博客系统实现了发布个人博客并记录博客的标题、内容、发布时间、发布人等详细信息的功能。

2025-03-21 09:27:40 913

原创 C++初阶 -- vector容器的接口详解

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

2025-02-03 01:33:34 1058

原创 C++初阶 -- 手撕string类(模拟实现string类)

首先得先判断len是否等于缺省值npos或者 len + pos 是否大于等于字符串实际存储有效字符的数量。如果出现以上两种情况直接在字符串中下标为pos的值赋值为'\0',再把pos赋给_size。字符串相较于字符比较难以控制追加的数量,所以得先求出追加字符串的长度,再判断追加字符串的长度 + 当前字符串的长度是否大于当前容器的容量。用strstr函数找到要找字符串的地址,如果strstr函数返回值为空指针就返回npos。大于就扩容,不大于就使用strcpy函数在已重新扩容的字符串中尾插待插入字符串。

2025-02-01 22:48:45 1269

原创 C++初阶 -- 初识STL和string类详细使用接口的教程(万字大章)

STL(standard template libaray-标准模板库:是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。string是表示字符串的字符串类该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。

2025-01-31 23:33:21 1585

原创 C++初阶 -- 泛型编程(函数模板、类模板)入门

编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。

2025-01-30 08:00:00 725

原创 C++初阶 -- C/C++的内存管理以及new、delete详解

class Apublic:// 单参数构造函数: _a(a)// 析构函数~A()private:int _a;int main()// malloc不方便解决动态申请的自定义类型对象的初始化问题//new的本质:开空间+调用构造函数初始化//想给多个自定义对象开辟空间// 1. 实例化多个对象(有名对象),在为其开辟空间A aa1 = 1;A aa2 = 1;A aa3 = 1;// 2. 匿名对象// 3. 数据的隐式类型转换。

2025-01-29 01:23:44 1186

原创 C++类与对象(四)-- 友元、内部类、匿名对象

这个内部类就叫做内部类。内部类是一个独立的类。

2024-12-31 15:01:59 927

原创 C++类与对象(三)-- 再谈构造函数(细嗦初始化列表)、static成员

在初始化列表显式地写出来并定义在该类的默认构造函数中给缺省值当发生类型转换时,就会产生一个临时变量来保存隐式转换后的对象。然后用这个临时对象拷贝构造aa。这就是类型转换因为有类的单参数构造函数如果类的单参数构造函数的参数类型为int,那int类型的内置类型变量就可以隐式转换为自定义类型对象如果类的单参数构造函数的参数类型为double,那double类型的内置类型变量就可以隐式转换为自定义类型对象以此类推,类的单参数构造函数的参数类型是哪种,哪种类型的变量就可以隐式转换为自定义类型对象。

2024-12-30 21:09:36 865

原创 算法 -- 双指针

【代码】算法 -- 双指针。

2024-11-28 08:00:00 238

原创 算法 -- 二分查找(Binary Search)

1、左区间和右区间:由于查找的区间是不断迭代更新的,所以确定查找的范围十分重要。主要的就是左右区间的开闭问题,开闭不一样,对应的迭代方法也不一样。二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。2、取中间值:因为二分查找每找一次就得更新中间值,那中间值该怎么求呢?当left和right都是接近 2147483647 的数字,我们如果想要做有关二分查找的题,有几个点是需要特别注意的。我们先看下二分查找和暴力遍历查找的示意图。我们就选第二种方法,原因是。,导致溢出,变成负数。

2024-11-27 21:36:57 581

原创 C++类与对象(二)-- 类的六个默认的成员函数【万字大章!!!!】

class Datepublic:/*// 如果用户显式定义了构造函数,编译器将不再生成_day = day;int _month;int _day;int main()// 会报错Date d1;return 0;将Date类中构造函数屏蔽后,代码可以通过编译,因为编译器生成了一个无参的默认构造函数;将Date类中构造函数放开,代码编译失败,因为一旦显式定义任何构造函数,编译器将不再生成;

2024-11-26 22:33:20 1602

原创 C++类与对象(一) -- 类的访问限定符、作用域、实例化、类对象、this指针

/ 类体:由成员函数和成员变量组成// 一定要注意后面的分号class为定义类的关键字ClassName为类的名字{ }中为类的主体,注意类定义结束时后面分号不能省略。类体中内容称为类的成员类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。int top;int top;

2024-11-20 21:21:34 1138

原创 初始C++(下)-- 引用、内联函数、auto关键字、基于范围的for循环、空指针nullptr

比如:李逵,在家称为"铁牛",江湖上人称"黑旋风"。 类型& 引用变量名(对象名) = 引用实体(这里的&就不是取地址的符号'&')注意:引用类型必须和引用实体是同种类型的引用变量和引用的变量共用一块地址空间 注意:如果函数返回时,出了函数作用域,如果返回对象还在(还没还给系统),则可以使用引用返回,如果已经还给系统了,则必须使用传值返回。 传引用返回,引用的对象最好是全局变量,静态变量或者是动态内存开辟,这样才能保证返回值的有效。当使用stati

2024-11-09 11:48:26 921

原创 初识C++(上) -- C++的关键字、命名空间、缺省参数以及函数的重载

定义命名空间,需要使用到namespace关键字后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。//命名空间中可以定义变量/函数/类型int val;ps:一个工程中的test.h和上面test.cpp中两个N1会被合并成一个// test.hint a;int b;int c;int d;注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。

2024-11-06 21:03:31 829

原创 探索Linux -- 冯诺依曼体系、初始操作系统、初始进程、fork函数

冯·诺依曼结构也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构。最早的计算机器仅内含固定用途的程序。若想要改变此机器的程序,就必须更改线路、更改结构甚至重新设计此机器。当然最早的计算机并没有设计成那种可编程化。当时所谓的"重写程序"指的是纸笔设计程序步骤,接着制订工程细节,再施工将机器的电路配线或结构改变。然后储存程序型电脑的概念改变了这一切,通俗的理解冯·诺伊曼结构与储存程序型电脑是互相通用的名词。冯·诺依曼提出抛弃十进制,采用二进制作为数字计算机的数制基础。同时,预先编制计算程

2024-08-09 23:16:36 1355 1

原创 Linux -- 进度条小程序

fflush -- 强制刷新(刷新一个流)

2024-08-07 16:34:06 767

原创 探索Linux世界之Linux环境开发工具的使用

vim 是从 vi 发展出来的一个文本编辑器。代码补全、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。简单的来说,vi 是老式的字处理器,不过功能已经很齐全了,但是还是有可以进步的地方。vim 则可以说是程序开发者的一项很好用的工具。vim编辑器中有着12种编辑模式,但是我们目前只需要掌握好这三种编辑模式(命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode)

2024-08-07 02:22:41 1023

原创 转义字符 ‘\‘ 和 百分号 ‘%‘ 的输出

而C 中定义了一些字母前加“\"来表示常见的那些不能显示的 ASCI 字符,如\t, \n 等,就称为。上面的表上也表示两个 ‘\\’ 才是反斜杠 '\'。,所以我们只需要在函数中输入两个'\\'即可输出一个'\'。,因为后面的字符,都不是它本来的 ASCII 字符意思了。转义字符是C语言中的表示字符的一种特殊形式,用反斜线“\”和特定的字母组合表示。在现在的学习过程中,发现对于以前的一些知识点有些遗忘,所以特地写篇文章来记录。但这次我们讨论的重点是如何在printf函数中输出一个反斜杠字符 '\'。

2024-07-27 11:30:21 1975

原创 探索Linux世界 —— shell与权限的相关知识

此时就会有人问,那什么是命令行解释器呢?Linux中的命令行解释器就由这几个部分组成。还有一点需要注意的是‘#’是root在使用,而‘$’是普通用户在使用目录的可执行权限是表示你可否在目录下执行命令。如果目录没有-x权限,则无法对目录执行任何命令,甚至无法cd 进入目, 即使目录仍然有-r 读权限(这个地方很容易犯错,认为有读权限就可以进入目录读取目录下的文件)而如果目录具有-x权限,但没有-r权限,则用户可以执行命令,可以cd进入目录。但由于没有目录的读权限。

2024-07-18 13:23:13 1141

原创 接着探索Linux的世界 -- 基本指令(文件查看、时间相关、打包压缩等等)

命令输出到某个指定文件中,而不是输出到终端屏幕或终端窗口。我们从键盘输入什么,cat命令就打印什么。命令 + >> + 目标文件名。: 将命令的结果写入目标文件中;这两条指令的作用等价。

2024-07-14 21:53:39 1975

原创 Linux的世界 -- 初次接触和一些常见的基本指令

这就是我们新建的一个文本文档,也可以叫做文件。我们可以看到这个新建的文本文档的大小是0KB,那我们是不是就可以认为这个文本文档不会占用磁盘空间呢?答案是错的,就算我们不在文档里面写入数据,文档也会在磁盘中站有一小部分内存。那为什么大小为空的文件却能占有磁盘的一小部分内存呢?那是因为文件不仅仅只有文件的内容,除了文件的内容,计算机还得记录文件的名字文件的修改时间文件的格式等等。而刚才说的这些内容全部叫做文件的属性文件的属性也是数据,也得被计算机记录下来。

2024-07-13 23:30:33 1251

原创 排序 -- 万能测试oj

这道题我们可以使用我们学过的那些常见的排序方法来进行解答。

2024-07-07 17:40:34 254

原创 排序 -- 手撕归并排序(递归和非递归写法)

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

2024-07-07 17:34:18 1107

原创 排序 -- 计数排序以及对排序的总结

计数排序在数据范围集中时,效率很高,但是适用范围及场景有限。时间复杂度:O(MAX(N,范围))空间复杂度:O(范围)稳定性:稳定。

2024-07-07 17:33:24 207

原创 排序 -- 冒泡排序和快速排序

冒泡排序是一种非常容易理解的排序时间复杂度:O(N^2)空间复杂度:O(1)稳定性:稳定快速排序整体的综合性能和使用场景都是比较好的,所以才敢叫快速排序时间复杂度:O(N*logN)空间复杂度:O(logN)稳定性:不稳定。

2024-07-07 08:30:00 1029

原创 排序 -- 直接选择排序和堆排序

直接选择排序思考非常好理解,但是效率不是很好。实际中很少使用时间复杂度:O(N^2)空间复杂度:O(1)稳定性:不稳定堆排序使用堆来选数,效率就高了很多。时间复杂度:O(N*logN)空间复杂度:O(1)稳定性:不稳定。

2024-07-06 11:33:39 470

原创 排序 —— 直接插入排序和希尔排序

1:元素集合越接近有序,直接插入排序算法的时间复杂度效率越高2:时间复杂度:O(N^2)3:空间复杂度:O(1)4:稳定性:稳定1、希尔排序是对直接插入排序的优化2、当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比3、希尔排序的时间复杂度不好计算,因为gap的取值方法很多,导致很难去计算,因此在好些树中给出的希尔排序的时间复杂度都不固定3、希尔排序。

2024-07-05 18:04:52 875

原创 leetcode -- 114.二叉树展开为链表

题目中要求把链表展开为单链表,并且展开后的链表要跟二叉树的前序遍历顺序相同。

2024-06-11 20:10:23 294

空空如也

空空如也

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

TA关注的人

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