- 博客(50)
- 收藏
- 关注
原创 【C++】非类型模板参数与模板特化介绍
摘要 本文介绍了C++模板的两个进阶特性:非类型模板参数和模板特化。非类型模板参数允许在模板中接收编译期常量(如整型、布尔值、指针等),C++20后还支持浮点类型。模板特化则针对特定类型提供定制实现,分为函数模板特化和类模板特化。函数模板仅支持全特化,需显式指定完整类型;类模板支持全特化(完全确定参数)和偏特化(部分特化,如指针类型)。通过特化可以优化特定场景下的模板行为,例如指针比较时解引用操作。代码演示了非类型参数定义缺省值、浮点模板参数(C++20)、日期类指针比较的特化实现等典型用法。
2026-07-30 17:51:05
189
原创 【Linux】 gcc/g++ 工具的使用及其动静态库的初步认识
本文介绍了GCC工具集中gcc和g++的基本用法,以及C/C++程序从源代码到可执行文件的完整编译过程。主要内容包括: gcc用于编译C程序,g++用于编译C++程序,二者会分别自动处理对应的标准库。 程序编译分为四个阶段: 预处理:展开头文件和宏(-E) 编译:生成汇编代码(-S) 汇编:生成目标文件(-c) 链接:合并目标文件和库生成可执行文件 介绍了动态库(.so)和静态库(.a)的区别: 动态链接:程序体积小,运行时需要库文件 静态链接:程序独立运行但体积大(-static选项) 演示了使用ldd查
2026-07-29 18:01:08
466
原创 【C++】常见的STL容器适配器详解及其模拟实现
本文介绍了STL中的三种容器适配器:stack、queue和priority_queue。它们基于现有容器(如vector、deque)实现,通过封装接口提供特定的数据结构功能:stack遵循后进先出,queue遵循先进先出,priority_queue按优先级处理元素。文章还简要探讨了双端队列deque的分段存储结构及其迭代器实现原理,并提供了这三种适配器的简单模拟实现代码,展示了如何复用底层容器接口来构建适配器功能。
2026-07-27 23:25:13
460
原创 【Linux】软件生态与vim工具的简单介绍
本文介绍了Linux系统中的软件生态、yum包管理工具的基本使用以及Vim编辑器的常用操作。主要内容包括:1) Linux软件来源与安装方式,包括源码安装、软件包安装和使用yum/apt等包管理器;2) yum的基本命令如查找、安装和卸载软件;3) Vim的多模式特点及常用操作,包括移动光标、复制删除、查找替换、保存退出等命令,以及简单的Vim配置方法。文章为Linux初学者提供了基础软件管理工具和文本编辑器的入门指导。
2026-07-25 17:23:01
374
原创 【C++】list的简单介绍与模拟实现
本文简要介绍了C++中list容器的基本概念和模拟实现方法。list采用带头双向循环链表结构,结点包含前驱和后继指针。与vector不同,list的迭代器需要封装为类并重载运算符,以支持双向访问。文章重点讲解了迭代器的实现,包括前置/后置++/--操作符重载,以及普通/常量迭代器的统一处理。同时展示了list的结点结构和整体框架,包括哨兵头结点的作用,以及begin()/end()等基础接口的实现原理。最后提及了push_back等增删操作的实现思路,体现了链表结构的灵活性。
2026-07-23 23:29:02
588
原创 【C++】vector的模拟实现详解(二)
C++ vector模拟实现详解(二) 本文详细介绍了如何模拟实现C++标准库中的vector容器。主要内容包括: vector的整体设计: 使用类模板实现泛型 通过三个指针(_start、_finish、_end_of_storage)管理连续空间 解释指针之间的关系和空间管理原理 构造与析构: 默认构造函数使用=default生成 析构函数负责释放动态申请的内存 迭代器实现: 使用原生指针实现普通迭代器和const迭代器 提供了begin()和end()方法 实现const对象的遍历功能 容量相关接口:
2026-07-20 22:25:23
433
原创 【Linux】Linux权限管理详解
摘要 本文系统介绍了Linux权限管理机制,主要内容包括: 用户身份:区分root超级用户与普通用户,以及使用su/sudo切换身份的方法。 权限分类:文件访问者分为所有者(u)、所属组(g)和其他用户(o)三类,系统按此顺序匹配权限。 权限查看:通过ls -l查看文件类型和9位权限,其中首字符表示文件类型,后9位分为三组(rwx)表示不同用户的权限。 权限含义: 文件:r(读内容)、w(改内容)、x(执行) 目录:r(列目录)、w(增删改)、x(进入访问) 权限表示: 字符表示:rwx组合 数字表示:r=
2026-07-18 19:38:59
502
原创 【C++】vector的认识与常用接口详解(一)
C++ vector 容器详解 本文全面介绍了 C++ 标准库中的 vector 容器,主要内容包括: 基本概念:vector 是一个动态数组,支持随机访问、元素连续存储、自动扩容等特性 构造方式:详细讲解 5 种构造方法,包括默认构造、n个元素构造、拷贝构造等 遍历方法:介绍下标访问、迭代器和范围 for 三种遍历方式 容量管理:解析 size、capacity、empty 等接口,以及 reserve 和 resize 的区别 元素操作:讲解 push_back、pop_back、insert、eras
2026-07-16 14:33:08
456
原创 【C++】string类的模拟实现详解(三)
本文在 qen 命名空间中实现了一个简化版 String 类,通过三个核心成员变量(字符指针、大小和容量)模拟标准库字符串的基本功能。主要内容包括:1) 实现构造/析构/深拷贝等基础操作;2) 提供迭代器、容量查询等常用接口;3) 实现字符串修改操作如插入/删除/追加;4) 重载关系运算符和IO运算符。重点解决了浅拷贝问题,通过深拷贝确保对象独立性,并处理了自赋值等边界情况。该实现展示了字符串自动扩容、数据移动等底层机制,帮助理解标准库 string 的工作原理。
2026-07-14 22:34:22
494
原创 【C++】string类的认识与常用接口详解(二)
本文深入探讨了C++标准库中string类的常用操作,包括字符串追加、插入、删除、替换、查找和截取等功能。主要内容包括: 字符串追加:介绍了push_back、append和operator+=三种方式,分别适用于追加单个字符、字符串片段和简洁拼接。 插入操作:讲解了insert方法在指定位置插入字符或字符串的多种用法,包括插入子字符串和重复字符。 删除操作:详述了erase方法的不同使用场景,包括根据位置删除、迭代器删除等,并强调了操作时的注意事项。 替换功能:介绍了replace方法的实现原理和使用方式
2026-07-12 20:42:34
430
原创 【C++】string类的认识与常用接口详解(一)
本文介绍了C++中string类的基本用法,包括字符串的构造、访问和迭代器操作。与C语言字符数组相比,string类能自动管理内存并提供更便捷的字符串操作。文章首先对比了C风格字符串的缺点,然后详细讲解了string类的多种构造函数、元素访问方式,以及auto关键字和范围for循环的使用。此外,还介绍了string的容量相关接口,如size()、capacity()等。迭代器部分则简要说明了其指针式访问特性。全文为后续深入学习string类奠定了基础,适合有一定C++基础的读者快速了解string的核心功能
2026-07-11 09:59:44
616
原创 〖C++〗STL简介:发展历史、六大组件与简单应用
本文介绍了C++标准模板库(STL)的基本概念和应用。STL是C++标准库的重要组成部分,提供了常见的数据结构和算法实现,包括容器(如vector、map、stack等)、算法(如sort、find等)和迭代器三大核心组件。文章首先阐述了STL的发展历史,从HP版本到SGI版本等重要实现。然后通过具体代码示例展示了STL的典型应用场景,如使用vector排序、set去重、map统计次数等。最后强调了STL在算法题和面试中的重要性,它能显著减少代码量,提高开发效率。STL通过模板技术实现了泛型编程,是现代C+
2026-07-10 18:32:03
320
原创 【C++】模板初阶:函数模板与类模板详解
本文介绍了C++模板的基础知识,重点讲解了函数模板的使用。主要内容包括: 泛型编程概念:通过类型无关的通用代码实现代码复用 函数模板语法:使用template<class T>或template<typename T>定义模板 模板实例化过程:编译器根据调用时的参数类型自动生成具体函数 参数推导问题及解决方法: 强制类型转换 显式实例化(Add<int>()) 使用多个模板参数 文章通过交换函数和加法函数的示例,展示了模板如何减少重复代码,提高开发效率。同时指出了类型推导可能产生的问题及解决方案。
2026-07-09 13:27:12
491
原创 【Linux】指令补充与shell的简单介绍
本文补充介绍了Linux常用指令和shell基础知识,主要包括: 管道符|的用法,可将前一个命令的输出作为下一个命令的输入 grep文本搜索命令及其常用选项 打包压缩相关命令(zip/unzip、tar、sz/rz、scp) bc计算器和uname系统信息命令 Linux常用热键(Ctrl+C终止、Ctrl+D退出等) shell的简单介绍,作为用户与内核的交互接口 文章通过具体示例讲解了这些指令的语法和典型应用场景,适合Linux初学者快速掌握基础操作。
2026-07-08 01:11:58
314
原创 【C++】内存管理与new、delete详解
C++的动态内存管理机制解析 摘要:本文系统介绍了C++的内存管理机制,重点对比了C++与C语言在内存管理上的异同。主要内容包括: C/C++程序内存布局的五大部分:栈区(函数局部变量)、堆区(动态分配内存)、全局/静态存储区、只读数据区和代码段,详细分析了各区域的特性和使用场景。 C++特有的new/delete操作符:相比C语言的malloc/free,new/delete不仅能管理内存,还会自动调用构造函数/析构函数,支持内置类型和自定义类型的初始化。文章通过代码示例演示了单对象和数组的分配释放方式。
2026-07-04 19:56:24
302
原创 【Linux】Linux常用基本指令(下)
本文是Linux基础指令的补充介绍,主要内容包括: 常用文件操作指令 echo/printf:输出内容到终端 mv:移动/重命名文件 cat/more/less:查看文件内容 head/tail:查看文件首尾内容 find/which/whereis:查找文件或命令 系统信息指令 date:查看/设置系统时间(支持多种格式) cal:查看日历 重定向操作 介绍标准输入/输出/错误流的概念 演示>、>>、<等重定向操作符 展示如何向其他终端发送消息 这些指令涵盖了Linux日常操作中的基本文件管理、内容查看和
2026-06-18 16:18:49
342
原创 【Linux】Linux简单介绍与基本指令(上)
Windows和Mac OS,但却很少听说过Linux这个操作系统,这个操作系统并没有像那两个操作系统一样为用户提供了形象成熟的图形化界面,最多就一个黑乎乎的终端,想要操作这个系统还要输一堆乱七八糟的指令这让这个操作系统对于普通用户来所并不友好,但是对于开发者来说则是几乎必须要掌握的操作系统内核和发行版。Linux 严格来说只是一个“内核”。内核就像汽车的发动机,负责管理 CPU、内存、硬盘等硬件资源,但光有发动机是没法开上路的,所以发行版就像是一辆“整车”。
2026-06-16 22:55:54
341
原创 【C++】类与对象之运算符重载相关函数介绍(三)
本文将会补充上文提到的默认成员函数中的赋值运算符重载函数,只要是因为涉及到运算符重载的知识所以我把它放这里了,随便再介绍一些重载相关的内容。
2026-06-11 13:47:07
389
原创 【C++】类与对象之类的默认成员函数(二)
构造函数虽然名字叫做构造函数,但构造函数的任务其实并不是开辟空间创建对象(当前函数的栈帧创建时空间就开好了),而是在类实例化时初始化对象,就像是我们用C语言手动实现栈或者队列时写的初始化函数Init时所做的那样。当类实例化为对象时,构造函数会自动的调用并用来初始化这个对象。函数名要和类名一样构造函数没有返回值,连void也没有!!!实例化时会默认的调用构造函数构造函数也是可以重载的如果你自己没有显式的定义构造函数的话,编译器会默认的生成一个无参数的隐式默认构造函数。
2026-06-08 00:45:21
378
原创 【C++】类与对象一
类就像是我们在C语言阶段学过的结构体的升级(事实上C++也会C语言的结构体进行了升级后面会有介绍),在以前学习的C语言的结构体中我们只能在结构体中定义成员变量,而不能在里面定义函数。而C++又是一个面向对象的语言,比如我想将洗衣机定义为一个对象的话我们不仅仅需要成员变量来描述这个洗衣机的参数,我们还需要各种函数来实现洗衣机的功能,用户才能通过接口来使用这个洗衣机。为了解决这个痛点实现面向对象,C++引入了类的概念。类不仅可以在里面定义成员变量,还可以在里面定义出成员函数。
2026-06-03 05:22:51
365
原创 【C++】超详细的入门基础语法详解
*C++**是一种被广泛使用的计算机程序设计语言。它是一种通用程序设计语言,支持多重编程范式,例如过程化程序设计面向对象程序设计泛型程序设计和函数式程序设计等C++是由比雅尼·斯特劳斯特鲁普博士早年间为了解决C语言的一些缺陷与局限性而开发的一门语言,引进了面向对象的概念,像是其他的语言比如Java、C#、python、go身上都多多少少有着C++的影子。
2026-05-26 08:00:00
505
原创 【算法笔记】各种常见排序算法详细解析(下)
本文将补充剩下的常见排序算法并对这些排序算法进行个大概的总结,主要是介绍递归类的算法花费的篇幅比较多(快速排序、归并排序),还会尝试把递归的形式改为非递归并补充一些关于排序的小概念。
2026-05-19 23:14:02
892
原创 【算法笔记】各种常见排序算法详细解析(上)
排序算法算是我们大多数人接触到的第一个算法了就比如大一上C语言教的冒泡排序,算是梦开始的地方了,排序算法除了冒泡排序还有很多种有像冒泡一样简单的也有一些难度比较高的比如快速排序、希尔排序等等。还需要注意的是我们学习排序不一定非要关注它有没有用,有些排序算法虽然相比其他排序比较慢但是还是很有教育意义的可以扩宽我们的思维下面的排序我都以排。
2026-05-14 15:03:09
1136
原创 【数据结构】二叉树相关经典函数C语言实现
这篇文章主要是补充一些二叉树相关的函数,因为二叉树是用递归来展开的结构所以大多数的函数都是使用递归实现的所以整体的代码量还是比较少的但是很容易因为某个奇奇怪怪的细节问题而导致效率低下或者死递归。
2026-05-10 18:51:26
491
原创 【算法笔记】简单贪心
贪心贪心顾名思义就是得要 "贪" ,简单来说就是通过不断选择局部最优来得出全局最优。比如说我需要在尽可能少的纸币中找给客人112元,那我会选择1张100元、1张10元、两张1元,而不是给客人112张1元。我们可以很轻松的想到每一步的最优解而且最后的结果就是全局的最优秀。但是在实际的解题中我们是很难证明通过这个局部最优最后的结果就是正确的,而且当题的难度上来时可能连贪心的策略都很难找到至少我现在是这样。
2026-05-03 23:06:45
935
原创 【数据结构】二叉树基本概念及堆的C语言模拟实现
二叉树是一种比较特殊的树型结构,二叉树树的每个结点的度最多有两个且有左右之分就像人的左右手一样,因此我们可以知道二叉树是一颗有序树结点的左子树的根节点被称为左孩子右边的则为右孩子。
2026-04-30 12:29:54
585
原创 【数据结构】树的基本概念及存储
树是数据结构中很大的一个概念,可以分为二叉树、红黑树等等分支。一般用于优化我们的搜索和实现一些排序比如堆排序等等。
2026-04-26 08:00:00
974
原创 【算法笔记】二分查找与二分答案
二分法主要用于快速的查找某个数,当这段区间满足二段性时我们就可以使用这个方法来以O(log n)的时间复杂度来完成目的。二分的模板有好几个,但我这里就固定使用一个模板来解决问题了,二分的模板也不难难度主要体现在题目里奇奇怪怪的细节问题。
2026-04-24 23:40:22
779
原创 【算法笔记】双指针及其经典例题解析
双指针时候又叫做尺取法或者滑动窗口,我们一般定义两个指针一个左指针left, 一个右指针right当条件满足时根据左右区间更新结果有时候我们会发现不一定需要套两层for循环才能得出结果,如果使用双指针的话且指针不用回退那我们就可以使用双指针法,将我们时间复杂度由O(n ^ 2)优化为了O(n)
2026-04-23 19:58:44
359
1
原创 【算法笔记】差分与经典例题解析
差分和前缀和一样也是一种用空间换取时间的做法,这个算法可以让一段区间快速的加减掉一个数字,具体的做法也是预处理出一个差分数组,然后再对一段区间加减某个数的操作后还需要将这个预处理的数组还原。
2026-04-22 21:18:25
553
原创 【数据结构】队列及其C语言模拟实现
队列是一种一端只能插入数据,一段只能删除数据的数据结构,与栈相反队列是一种先进先出的数据结构,其实也有两边都可以插入与删除的队列这种叫做双端队列,但我这里讲的是普通的队列。其中插入数据的一端为,出数据的一端为。
2026-04-21 22:41:27
422
原创 【算法笔记】前缀和经典题目解析
前缀和可以用于快速求某一个区间各个值的和,原理是先预处理好所有的值,创建一个预处理好的数组,这个预处理的数组中的每个值都是原数组相同位置上前面的所有值相加。这是一种空间换取时间的做法。
2026-04-20 17:44:33
471
原创 【算法笔记】普通枚举与二进制枚举
枚举就是把所有的情况给一个个枚举出来,一般当题目难度上来后往往会超时,所以需要后面学的一些算法(比如二分、分治、差分)等等来优化,但我们也可以通过优化枚举顺序、方式、枚举的对象来优化枚举,如果时间卡得不紧的话是可以通过的。
2026-04-19 07:02:14
405
原创 【算法笔记】模拟与高精度加减乘除
模拟一般主要考察我们的代码能力,同时多做模拟题还可以提升我们的代码能力,主要考察的是你的代码实现能力,而高精度加减乘除则是一个模板,用于处理多位数运算的问题。
2026-04-18 23:21:59
362
原创 【数据结构】栈及其C语言模拟实现
栈是一种特殊的线性表,它只允许元素在一段插入或者删除,而被插入或者删除的那一段被称之为栈顶相对应的另外一段则被称之为栈底,所以我们不难想象栈是一种先进后出(后进先出)的数据结构它的结构有点像羽毛球筒(只考虑只有一段能取放),我们像要拿下一个羽毛球时只能先把前面的羽毛球先取出来才能拿到下一个羽毛球:比如有编号分别为1、2、3、4的元素依次进入栈()时:那我们只能根据4、3、2、1的取出()里面的元素(已取出的元素不会重新放回去),当元素里的元素被全部取出来时,此时我们称这个栈为一个。
2026-04-17 22:42:03
969
1
原创 【算法笔记】时间复杂度与空间复杂度
在近代中,电脑硬件发展的速度非常快,比如我们耳熟能详的摩尔定律就是在这个背景下诞生的CUP的运算速度的越来越快,像是一些比较垃圾的CUP都能有每秒几亿次的计算效率, 而内存的发展更是,所以我们在衡量一个算法的好坏的时候我们一般主要关注时间复杂度。时间复杂度并不是指每个时间段这个程序的运行速率,因为这个东西很受硬件的影响,比如我的电脑比你的电脑好很多的话,我更快的出了结果难道我写的程序就一定比你好吗?这样比较显然是不公平的,所以我们说的是时间复杂度,但是我们关注的其实是这个程序的运行次数。
2026-04-14 14:15:05
393
原创 【简单小项目】从零用C语言实现贪吃蛇
贪吃蛇这个小游戏很适合将前面我们学习到的C语言知识和数据结构中的链表做个总复习并实践,所以本文将带领大家逐步实现贪吃蛇游戏,并学习一些实现这个小游戏所必须掌握的前置知识(win32)
2026-01-25 14:48:39
746
原创 【数据结构】单链表及双向链表的解析与实现
在前面我们学过的顺序表中,我们虽然在实现的动态顺序表,根据实际需要动态的申请两倍或者n倍的空间,但实际上还是很容易造成空间浪费的情况发生,而且当我们对这个顺序表进行增删改查时要有时要挪动这个顺序表的所有元素,这就很容易造成效率低下的问题发生,而链表正是为了优化这个问题。链表就像是上面挂满了一个个珠子的手串一样,上面的每一个珠子就是链表的一个个节点:这样我们就可以根据不同人不同手腕的大小(不同的需求)来满足各种不同的需求,链表的这种结构使得我们可以更加精细化的申请动态内存空间,减少空间的浪费。
2026-01-21 12:32:36
955
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅