自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 浅谈new与::operator new

本文探讨了C++中vector使用迭代器指针替代传统顺序表成员变量的原因。通过分析vector源码发现,其空间操作函数使用operator new/delete而非new/delete,实现了内存分配与对象构造的分离。operator new只分配原始内存,配合placement new在指定位置构造对象,避免了new自动调用构造函数的性能浪费。这种设计符合C++将内存分配与对象构造分离的核心思想,同时operator new的异常处理机制也更符合C++风格。虽然对vector采用三个指针的真正原因解释可能

2025-08-30 17:22:28 859

原创 【C++闯关笔记】STL:vector的学习与使用

本文介绍了C++中的vector容器,从数据结构本质将其视为功能更强大的动态顺序表。文章分为"能用"和"明理"两部分:首先讲解vector的常用接口使用方法,包括构造、迭代器、增删查改等操作;然后通过模拟实现vector底层机制,详细解析其三个核心指针成员和关键函数实现原理。重点对比了C风格顺序表与vector的差异,阐述了vector自动管理内存、动态扩容等特性,帮助读者深入理解这个常用容器的内部工作机制。最后展示了如何实现构造函数、迭代器、增删改查函数以及空间管理

2025-08-29 16:55:38 1484

原创 【C++闯关笔记】STL:string的学习和使用(万字精讲)

本文介绍了C++标准模板库(STL)中的string类,重点讲解了其常用功能和实现原理。首先概述STL的组成及string类的作用,对比了string与C风格字符数组的区别。然后详细说明string的创建方法、修改操作(增删改)、遍历方式(下标、迭代器、范围for)以及容量管理函数。特别强调了resize()与reserve()的区别,并介绍了查找(find)、截取(substr)等实用功能。最后通过模拟实现string类,包括构造函数、析构函数、成员函数等核心代码,深入解析了string的内部工作机制。

2025-08-24 18:15:48 752

原创 【C++闯关笔记】封装②:友元与模板

本文系统介绍了C++中的友元机制、内存布局、静态与const成员以及模板编程。重点解析了友元函数和友元类的使用场景及特性,详细说明了C++程序的内存分区结构,阐述了静态成员与const成员的区别与联系,最后讲解了函数模板和类模板的定义与实例化方法。文章通过具体示例,深入浅出地讲解了这些C++核心概念的应用场景和注意事项,为理解C++面向对象编程提供了全面的技术参考。

2025-08-22 20:19:22 816

原创 【C++闯关笔记】封装①:类与对象

本文介绍了C++面向对象编程中的封装概念。通过对比C语言面向过程与C++面向对象的差异,阐述了类的基本定义和访问限定符的作用。重点讲解了类的六个默认成员函数中的四个关键函数:构造函数(初始化对象)、析构函数(清理资源)、拷贝构造函数(对象复制)和赋值运算符重载(对象赋值)。文章通过洗衣服的生动例子说明面向对象的优势,并详细分析了封装带来的数据安全性、可扩展性等好处。最后提供了一个完整的Date类示例,展示了这些概念的实际应用。该文适合C++初学者理解面向对象编程的核心思想。

2025-08-21 19:54:37 863 1

原创 从C到C++入门:C++有而C语言没有的基础知识总结

本文较为系统的整理介绍了八种C++与C语言的差异,指出了一些C++经常使用而C语言完全没有的基础知识,为想要入门C++的读者,或者想要知道C++与C语言差异的读者,相信本文能为你提供帮助。

2025-08-15 16:13:06 884 1

原创 【排序算法】⑦归并排序

文章介绍了归并排序算法,这是一种基于分治策略的稳定排序方法。归并排序通过"分"(递归分解数组)和"治"(有序合并子数组)两个阶段实现排序,时间复杂度稳定为O(nlogn)。文章详细讲解了递归实现过程,包括数组分解、子数组合并等核心步骤,并提供了完整代码实现。同时分析了归并排序的优缺点:空间复杂度高(O(n))但稳定性好,适合大数据集排序。文章还指出该算法可用于链表排序,但对小数据集效率不如插入排序。

2025-08-11 19:52:21 1101

原创 【排序算法】⑥快速排序:Hoare、挖坑法、前后指针法

本文系统介绍了快速排序算法及其三种实现方式:经典Hoare算法、挖坑法和前后指针法。文章首先阐述了快排的基本思想——通过基准值将数组分为左右子序列,采用递归方式实现。重点分析了Hoare算法的实现细节,包括三数取中优化、关键循环顺序选择等,并给出了完整代码框架。随后介绍了挖坑法和前后指针法的实现原理与代码。最后比较了三种方法的异同,指出它们都是实现分区操作的不同策略,具有O(nlogn)的时间复杂度,但都是不稳定的排序算法。文章还建议对小数组采用插入排序进行优化,以减少递归开销。全文通过图解和代码示例详细解

2025-08-11 17:22:52 1124

原创 【排序算法】⑤冒泡排序

本文是排序算法系列第五篇,主要讲解冒泡排序算法。冒泡排序属于交换排序,其核心思想是通过相邻元素比较交换,使较大元素逐渐"上浮"到正确位置。文章详细介绍了算法原理、通过图解说明排序过程,并提供了C++实现代码,其中包含提前终止的优化策略。最后分析了算法特性:时间复杂度O(N^2)(优化后效率提升约3倍),空间复杂度O(1),且具有稳定性。本文作为快速排序的铺垫,后续将重点介绍更高效的快速排序算法。

2025-08-11 17:19:47 490

原创 【排序算法】④堆排序

本文介绍了堆排序的实现原理及算法步骤。堆排序是一种基于完全二叉树结构的选择排序算法,通过构建大堆实现升序排序。文章详细讲解了堆的构建、向上/向下调整等核心算法,并提供了完整的堆排序代码实现。分析了堆排序的时间复杂度为O(nlogn),空间复杂度为O(n),属于不稳定排序。关键点在于排升序建大堆,通过不断交换堆顶与末尾元素并调整堆结构来完成排序。

2025-08-09 19:02:54 1119

原创 【排序算法】③直接选择排序

本文介绍了直接选择排序算法,分析了其实现原理与特性。该算法通过每次从未排序部分选择最小/最大元素放入已排序部分末尾来实现排序,时间复杂度为O(n²),空间复杂度O(1),属于不稳定排序。与直接插入排序相比,直接选择排序不依赖数据分布但效率固定较低,而插入排序在数据有序时可达O(n)。文章还提供了C语言实现代码,并指出后续将介绍更高效的堆排序算法。

2025-08-09 16:26:19 613

原创 【排序算法】②希尔排序

本文介绍了希尔排序算法,它是基于直接插入排序优化的一种排序方法。算法通过分组预排序(按gap间距分组)和最终直接插入排序(gap=1)两个步骤实现高效排序。文章详细解释了希尔排序的工作原理,分析了其时间复杂度约为O(N^1.3),空间复杂度为O(1),并指出其不稳定的特性。通过代码示例和图文说明,阐述了如何通过预排序使数组接近有序,从而提升整体排序效率。希尔排序适用于大规模数据排序,是直接插入排序的重要优化版本。

2025-08-09 11:58:32 1243

原创 【排序算法】①直接插入排序

本文介绍了直接插入排序算法,这是一种基础的插入排序方法。文章首先阐述了其算法思想——将未排序元素逐个插入已排序序列中,类比扑克牌整理过程。接着详细解析了实现原理,提供了C语言代码实现,并逐步讲解了升序排序过程。最后分析了该算法的特性:在接近有序数据时效率高,时间复杂度O(N^2),空间复杂度O(1),且具有稳定性。作为排序算法系列的第一篇,本文为后续更高效的排序算法(如希尔排序)奠定了基础。

2025-08-09 10:36:10 756

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

本文介绍了二叉树的链式存储实现方法,包括二叉链表结构体定义和基本操作函数。重点讲解了三种递归遍历方式(前序、中序、后序)的实现原理,以及节点统计、查找、销毁等递归函数的编写。通过队列辅助实现了层序遍历和完全二叉树判断。最后对比分析了数组存储(堆式结构)和链式存储的优缺点:数组存储适合完全二叉树,访问高效但空间利用率低;链式存储灵活支持任意树形,指针操作方便但存在空间开销。文章配有详细代码示例和执行过程分析,帮助理解二叉树链式存储的实现机制。

2025-08-05 16:18:23 949

原创 【数据结构】二叉树①-堆

本文系统介绍了树、二叉树与堆的数据结构。首先阐述了树的基本概念(根节点、叶节点、度等)和二叉树的特殊形态(满二叉树、完全二叉树)及其数学性质。重点讲解了堆的实现原理,包括核心算法(向上/向下调整)、堆的构建(初始化、插入、删除等操作)以及完整代码实现。特别分析了堆的优缺点:高效获取极值(O(1))但无法快速查找中间元素,并探讨了堆在堆排序和TopK问题中的典型应用。文章通过代码示例和逻辑图解,完整呈现了堆这一重要数据结构从理论到实践的完整知识体系。

2025-08-04 17:51:31 1281

原创 C语言操作符补充

本文介绍了C语言中不常用但重要的操作符知识。首先讲解了原码、反码和补码的概念及转换方法,说明计算机中数据以补码存储的原因。重点解析了移位操作符(<<和>>)的运算规则及其高效性优势,以及四种位操作符(&、|、^、~)的使用方法和实际应用场景,如Linux系统编程中的进程状态处理。最后简要说明了逗号表达式的执行特性和结构体成员访问符的使用。这些知识点能提升编程效率,特别在需要直接操作二进制数据的场景中。

2025-07-15 18:40:00 870

原创 Linux进程信号详解

本文系统介绍了Linux进程信号机制,主要内容包括:信号的概念(通知机制、进程识别与保存方式)、信号产生途径(终端输入、系统调用、硬件/软件异常)、信号保存(内核三张表结构)、信号处理流程(用户态/内核态切换)及相关系统调用函数。文章还拓展了可重入函数、SIGCHLD信号应用等知识点,并提供了多个代码示例帮助理解信号机制的实际应用。通过信号,操作系统可以高效管理进程对各种事件的响应和处理。

2025-07-14 10:26:18 607

原创 深究二分查找算法:从普通到进阶

本系列遵循由实践—理论—实践的过程,首先通过一些经典题型来认识、引出算法,然后再详细讲解该算法核心逻辑以及使用方法等,最后再回到实践中用该算法解决具体问题。本篇主要介绍经典的二分算法。

2025-06-08 19:25:46 651

原创 【深入学习Linux】System V共享内存

本文系统介绍了SystemV IPC中的共享内存通信机制。首先阐述共享内存的基本概念:通过让不同进程访问同一块物理内存实现通信,既保持进程独立性又实现协同工作。重点解析了共享内存的实现原理,对比了与普通内存申请的区别。文章详细讲解了四个核心API:shmget(申请)、ftok(生成key)、shmctl(控制)、shmat/shmat(关联管理),并分析了key与shmid的关系。最后从性能角度指出共享内存的优势(减少数据拷贝次数)和缺陷(缺乏同步机制),建议结合管道实现保护。本文全面剖析了共享内存的技术

2025-06-06 11:21:00 620

原创 Linux环境管道通信介绍

本文讨论了管道通信的原理和相关函数的用法。本文先从进程通信的本质“让通信双方看到同一份资源”入手,再通过匿名管道的原理和创建过程深入理解管道通信的原理,最后介绍了命名管道以及有关管道的一些细节。

2025-06-04 11:18:48 700

原创 【万字精讲】小白也能看懂,一文带你彻底搞懂指针!!——深入理解C语言指针:从基础到进阶

指针是C语言的核心概念,而它本质上是内存地址的别名。本文系统性地讲解了指针知识体系,大体分为两个阶段:第一阶段是介绍指针及其相关的基础知识;第二阶段则介绍一些容易混淆的指针相关知识。本文用着重笔墨介绍关指针的基础知识,也就是第一阶段,对于一些容易混淆的指针知识也在第二阶段有所介绍。

2025-05-30 20:23:33 989

原创 介绍软硬链接的本质区别,动/静态库概念和使用

本文系统介绍了Linux系统中软硬链接与动静态库的核心概念和应用。在软硬链接部分,重点解析了其本质区别:软链接拥有独立inode而硬链接与原文件共享inode,并详细说明了硬链接数的意义和文件删除机制。动静态库部分从概念对比入手,通过自制静态库的完整流程(制作、打包、使用)深入展示技术细节,特别强调动态库需添加位置无关码和使用特殊指令打包。最后阐述了动静态库加载的关键差异:静态库函数代码直接拷贝到可执行文件,而动态库采用运行时地址映射机制。全文通过理论说明结合实践操作,清晰呈现了Linux文件系统这两项重要

2025-05-29 09:43:13 708

原创 理解Linux文件系统——通过磁盘结构

本文首先介绍了磁盘的基本构造,包括物理结构和存储结构,并详细解释了磁盘的线性化处理及其在操作系统中的重要性。接着,文章探讨了文件系统的管理机制,特别是如何通过分而治之的方法管理大容量磁盘,并介绍了文件查找和目录管理的具体过程。最后,文章解答了在Linux系统中通过文件名和路径打开文件的原理,以及目录权限和文件删除的相关问题。通过本文,读者可以更深入地理解文件系统的工作原理及其在操作系统中的应用。

2025-05-19 14:45:39 748

原创 从硬件角度理解“Linux下一切皆文件“,详解用户级缓冲区

本文描述述了笔者目前阶段就“Linux下一切皆文件”的理解,同时详解了什么是用户级缓冲区。

2025-05-16 21:48:26 1288 2

原创 Linux中有关文件操作的系统接口,文件描述符,重定向的介绍

本文介绍了Linux中文件操作的系统调用接口,包括open、close、write和read,并探讨了文件操作的本质——进程与被打开文件之间的关系。文章还介绍什么是标记位,什么是umask,并详细解释了文件描述符的概念及其分配规则,并通过C语言中的FILE结构体展示了文件描述符的封装。最后我们介绍连重定向的概念,并用普通文件log.txt重定向了stdout。

2025-05-15 19:00:43 1043

原创 C语言常见的文件操作函数总结

本文总结了C语言中,有关文件操作的一些常用的函数。由于在日常较少使用这些函数,每每想用时又不免查找,因此有了这篇文章。

2025-05-11 16:09:42 802

原创 Linux环境下进程的程序替换

本文主要通过介绍exec系列函数的使用方法解释了什么是进程的程序替换,最后还解释main函数的三个参数都是由exec系列函数传入的概念。

2025-05-05 19:56:15 751

原创 Linux环境下的进程创建-fork函数的使用与写时拷贝, 进程退出exit和_exit的区别,以及进程等待waitpid和status数据的提取方法

本文从进fork函数入手介绍了什么是进程创建,再通过strerror函数引出退出码以及exit和_exit的区别与联系,最后通过waitpid引出status的使用与相关数据的提取。本文还介绍了阻塞等待与非阻塞等待的区别。

2025-05-04 21:19:36 786

原创 进程优先级介绍,详解环境变量,详解进程地址空间

本文先介绍了进程的优先级,以及Linux中的优先级是如何确定的,之后介绍了什么是环境变量及其作用,最后介绍了什么是地址进程地址空间、mm_struct,以及为什么要使用虚拟地址。

2025-04-29 22:39:43 734

原创 详解操作系统是如何管理计算机软硬件资源的,以及Linux中进程状态的观察与解释

本篇文章先是介绍了冯诺依曼体系结构;其次介绍了操作系统的概念、目的以及操作系统是如何做到在计算机中承上启下充当核心角色的;最后介绍了进程的状态,包括什么是进程,见识进程在Linux中是什么样的,什么是父子进程,如何理解后台进程,以及介绍了Linux中常见的几种进程状态,最后还介绍了什么是孤儿进程。

2025-04-29 21:15:52 845

原创 Linux常见工具如yum、vim、gcc、gdb的基本使用,以及编译过程和动静态链接的区别

本篇文章主要介绍了yum、vim、gcc/g++以及gbd的基本使用方法,同时补充了程序的编译过程和动静态链接过程。

2025-04-16 19:32:32 1284

原创 初识Linux:常见指令介绍,文件权限的更改,以及粘滞位的理解

本文介绍了linux中的一些常见指令,以及对权限的理解,如何更改权限,粘滞位理解等。

2025-04-09 19:16:43 1088

原创 string的学习和使用

什么是string?string 是C++标准库提供的字符串类。string与char s[ ]的区别是什么?①char s[ ]本质上还是数组,长度固定;string长度不限;②string本质是类,其中包含有大量函数,方便操作;③string中重载了如‘+’ ’>' '<"等符号,便于操作;④可以将string理解为包含了大量函数的char s[ ]。

2025-03-20 15:58:59 1144

原创 国产开放麒麟操作系统的安装教程--从下载镜像到完美运行

一些原因需要使用开放麒麟系统,本文将安装步骤总结出来,以供有同样需求的朋友同学参考。本文讲述VMware虚拟机安装开放麒麟(openKylin)系统,VMware虚拟机的安装与普通软件安装类似,注意安装在C盘之外就行。VMware虚拟机——安装保姆级教程(附安装包)-CSDN博客最后,欢迎来到开放麒麟!

2025-03-20 15:54:56 4136

原创 【数据结构】队列

什么是队列?队列与栈类似,都是操作“受限制”的线性表。栈是只允许在栈顶进行插入删除操作,而队列则是只允许在一端进行插入数据,在另一端进行删除数据操作的特殊线性表。队头:进行删除操作的一端称为队头。队尾:进行插入操作的一端称为队尾;由于队尾入数据,队头出数据,由此队列有个重要的特性先进先出 FIFO(First In First Out)。提示:以下是本篇文章正文内容,下面案例可供参考。

2024-12-15 18:00:38 716

原创 【数据结构】栈

什么是栈?栈:一种特殊的线性表其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。栈顶 栈底是什么,线性表又是什么?栈顶与栈底是不固定的,取决于你想在哪边操作。拿顺序表举例,若只在表尾增删,那表尾就是栈顶,相对的表头就是栈底。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除操作叫做出栈,出数据也在栈顶。因为栈一般是存储在堆上的,故栈的大小可以看作无穷大(取决于你的机器)。【数据结构】初阶——顺序表①为什么说栈是受限制的。

2024-12-14 18:30:33 733

原创 【数据结构】链表②-带头双向循环链表

什么是链表?链表是一种在物理存储结构上非连续,但在逻辑结构上连续的一种存储结构,这种逻辑上的联系通过链表中的指针实现。实际上我们常用的一种是单链表,另一种是带头双向循环链表所谓单链表就是无头结点,单向,非循环。下图展现的就是单链表:与单链表相反的就是本文主角。

2024-12-13 16:41:30 970

原创 【数据结构】链表①-单链表

什么是链表?链表是一种在物理存储结构上非连续,但在逻辑结构上连续的一种存储结构,这种逻辑上的联系通过链表中的指针实现。何为逻辑上的连续呢?我们可以将链表想象成一辆火车,车头连着车厢,车厢与车箱间连着。注意:1.链表是逻辑上相连,物理结构上不一定相连;2.链表的节点一般都是在堆上申请出来的(即malloc或者new出来的);

2024-12-11 22:13:42 1003

原创 【数据结构】快速排序——(图文并讲)左右指针法(hoare版本)

排序有多种算法,其中快速排序(以下简称快排)因时间复杂度明显优于其他算法,故在日常使用中较为频繁。左右指针法,挖坑法,前后指针法等。这篇文章主要讲解左右指针法。

2024-11-22 19:01:38 423

原创 【数据结构】顺序表

本文介绍了顺序表这一基础数据结构。顺序表是一种用连续物理地址存储数据的线性结构,具有逻辑相邻元素物理存储也相邻的特点。文章详细讲解了顺序表的静态和动态实现方式,重点阐述了动态顺序表的代码实现,包括初始化、销毁、增删查改等核心操作。其中详细说明了头插/尾插、头删/尾删等操作的实现方法及注意事项,并提供了扩容检查、判空、打印等辅助函数。文章还通过代码示例展示了如何优化函数调用以提高可维护性,最后给出了完整的顺序表实现代码。顺序表作为数据结构的入门内容,其理解对后续学习链表等更复杂结构具有重要意义。

2024-10-27 10:44:02 952 1

空空如也

空空如也

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

TA关注的人

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