自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 map与multimap

摘要: map是STL中的关联容器,以键值对形式存储元素,并按key自动排序。其特点包括:key唯一不可修改,value可修改;底层采用红黑树实现,查找效率O(logN);支持下标访问、迭代遍历等操作。常用操作有insert插入(返回pair<iterator,bool>)、erase删除、find查找等,还提供size/empty/swap等成员函数。multimap是其允许key重复的版本,但不支持[]运算符。map可通过四种方式构造,并支持三种遍历方式(范围for、正向/反向迭代器),[]

2025-06-23 20:00:13 633 1

原创 详解main的参数并实现读取文件

摘要:C语言中main函数的argc和argv参数用于接收命令行参数,其中argc表示参数总数,argv是存储参数的字符串数组。以点餐系统为例,argv[0]为程序名,argv[1]开始为用户参数。示例代码展示了如何读取文件参数(如菜单文件)并解析命令行参数,包含文件操作和参数遍历的基本方法。程序需检查参数数量(argc)和文件打开状态,确保正确执行。该机制广泛用于Linux环境下的命令行程序开发。

2025-06-23 19:57:46 410

原创 深入理解二叉搜索树:原理到实践

二叉搜索树(BST)是一种基于节点键值有序排列的二叉树结构,具有以下特性:左子树节点值≤根节点值≤右子树节点值。本文详细介绍了BST的核心操作:插入时按键值大小确定位置;查找通过键值比较遍历;删除需处理四种不同子节点情况。分析了BST的性能,最优情况(完全二叉树)时间复杂度为O(logN),最差(单支树)为O(N)。文章通过C++代码实现展示了BST的基本操作,并区分了纯key模型(如门禁系统)和key-value模型(如停车计费)的应用场景。最后通过单词词典和水果计数两个案例,演示了key-value型B

2025-06-06 23:19:53 945

原创 c++ set与multiset的介绍

1.set的底层是平衡二叉树/二叉搜索树(红黑树),增删查效率是O(logN) ,迭代器遍历是⾛的搜索树的中序,是有序的,2、set元素有唯一的key值,set底层是⽤红⿊树实现,增删查效率是 O(logN) ,迭代器遍历是⾛的搜索树的中序,所以是有序。3.set中的元素不能被修改,因为set在底层是用二叉搜索树来实现的,若是对二叉搜索树当中某个结点的值进行了修改,那么这棵树将不再是二叉搜索树。注:红黑树包含二叉搜索树。成员函数功能描述insert插入指定元素,保证元素唯一性,插入重复元素会被忽略。

2025-06-06 23:18:44 414

原创 c++纯虚析构函数:为何必须定义?

可以将基类的析构函数声明为纯虚函数,但必须为其提供定义。这看起来有些矛盾(纯虚函数通常不需要定义),但背后有严格的逻辑和内存管理需求。

2025-05-15 22:57:43 309

原创 c++多态面试题之(析构函数与虚函数)

析构函数要不要定义成虚函数?基类的析构函数要不要定义成虚函数?如果不定义会有什么问题,定义了在什么场景下起作用。

2025-05-15 22:52:44 323

原创 万文c++继承

继承的概念及定义,继承基类成员访问方式的变化,继承类模板,基类和派生类间的转换,继承中的作用域,派生类的默认成员函数,继承与友元,静态成员,多继承及其菱形继承,继承和组合

2025-05-14 20:37:53 1187 1

原创 c++模板全覆盖

函数模板(隐式 显式), 特化,编译链接过程

2025-05-08 23:07:46 1126

原创 进阶模板c++

非类型模板参数,编译链接过程,模板定义与声明分离产生的问题

2025-05-08 23:03:22 622

原创 简单的 shell 程序

在编写一个简单的 shell 程序时,我们需要一些全局变量来存储和管理不同类型的数据。// 命令行参数表// 环境变量表// 别名映射表// 最后一次命令的退出码:这是一个宏定义,用来规定用户输入命令行的最大长度。在读取用户输入时,我们可以使用这个值来确保不会超出缓冲区的范围,避免缓冲区溢出问题。FORMAT:同样是宏定义,它规定了命令行提示符的格式。%s是格式化字符串中的占位符,分别用于插入用户名、主机名和当前工作目录。MAXARGC:定义了命令行参数的最大数量。g_argv。

2025-04-27 18:08:01 1014

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

c++类的简介,类实例化的大小计算,内存对齐规则,this指针

2025-04-24 20:17:20 982

原创 C++区别于C语言的提升用法(万字总结)

命名空间域namespace,c++各种域分类,输入输出,缺省函数,函数重载,引用,nullprt,auto语法糖,范围for,内联函数

2025-04-24 18:03:56 980

原创 STL C++详解——priority_queue的使用和模拟实现 堆的使用

堆的简介,以及实现的方式,二叉树的性质

2025-04-22 18:33:07 1426 13

原创 分布自定义shell脚本(详写)附带全代码

还在为复杂的系统命令操作头疼?想拥有属于自己的 “专属小助手”?快来一起探索 自制简易 shell 程序 的奇妙世界!只需跟着步骤,从基础的头文件引入、变量定义,到处理 cd、echo 等常用命令,再到实现外部命令执行,手把手教你从零搭建一个功能丰富的 shell。无需高深技巧,就能让你深入理解命令行的运行逻辑,轻松玩转系统交互。无论是编程小白还是进阶爱好者,都能从中收获知识与成就感,解锁命令行操作的新姿势,快来开启这场有趣的编程之旅吧!

2025-04-20 16:29:57 1290 31

原创 进程控制(详写)

进程创建:通过fork复制父进程,利用写时拷贝技术保证内存效率,父子进程执行相同代码但拥有独立数据空间。进程终止:分为正常退出(exit/return)与异常终止(如信号终止)。退出码($?)反映执行状态,0表示成功,非0为错误类型。进程等待:使用wait/waitpid回收子进程资源,避免僵尸进程。支持阻塞与非阻塞模式,通过状态参数解析退出原因(正常结束或信号终止)。程序替换:exec函数族(如execl/execvp)加载新程序到进程空间,替换原有代码,保持PID不变。需区分路径搜索(p后缀

2025-04-20 16:00:50 1498 19

原创 进程程序替换

fork()之后,⽗⼦各⾃执⾏⽗进程代码的⼀部分如果⼦进程就想执⾏⼀个全新的程序呢?进程的程序替换来完成这个功能!程序替换是通过特定的接⼝,加载磁盘上的⼀个全新的程序(代码和数据),加载到调⽤进程的地址空间中!

2025-04-19 21:10:53 998 1

原创 详讲Linux下进程等待

大强想知道小强啥时候把任务完成,就用了个办法:他跟小强说,等你干完活,记得跟我说一声。然后大强就不做别的事了(从运行状态变成阻塞状态 )在那等着小强的消息,把 CPU 让给其他小伙伴(其他就绪进程 )去用。小强呢,就跑去收集石头了。等他把石头收集完(子进程完成任务并终止 ),就赶紧给大强发个信号,说 “我干完啦”。大强收到这个信号后,就从等着的状态(阻塞状态 )醒过来(变成就绪状态 ),然后就又可以让大强接着做他后面的事啦,比如看看小强收集的石头合不合格(处理子进程的终止状态 )。

2025-04-19 19:22:21 1562

原创 进程创建和终止

想return 什么就写什么。exit函数VS exit函数_exit(系统提供)include<unistd.h>void_exit(intstatus);参数:status定义了进程的终⽌状态,⽗进程通过wait来获取该值说明:虽然status是int,但是仅有低8位可以被⽗进程所⽤。所以_exit(-1)时,在终端执⾏发现返回值是255。exit(C语言库提供)include<unistd.h>voidexit。

2025-04-18 21:32:03 599

原创 程序地址空间

描述linux下进程的地址空间的所有的信息的结构体是 mm_struct (内存描述符)。每个进程只有⼀ 个mm_struct结构,在每个进程的task_struct(进程=task_struct+代码和数据)结构中,有⼀个指向该进程的结构。转换步骤:首先,每一个进程,CPU 获取到应用程序发出的虚拟地址;然后,MMU 根据当前进程的页表信息,查找虚拟地址对应的物理地址;最后,将转换后的物理地址发送给内存控制器,内存控制器根据物理地址从物理内存中读取或写入数据。

2025-04-18 14:49:45 852

原创 STL c++ 详解——stack与queue模拟实现与deque的介绍

容器适配器,简单了解deque与stack,queue模拟

2025-04-15 22:39:09 744

原创 栈与队列习题分享(精写)

栈与队列在c++模板下的,基础练习最小栈、栈的压入,弹出序列、用队列实现栈、用栈实现队列

2025-04-14 17:54:32 837 22

原创 STL c++ 详解——stack和queue 的深度解析和实践指南

stack和queue的介绍与使用,配合string和list与vector的好处

2025-04-14 04:41:45 1060 17

原创 Linux进程概念(详实)

爆肝四天写出万文Linux进程概念

2025-04-13 20:31:01 1678 2

原创 认识操作系统(Operator System)

操作系统的定位是:⼀款纯正的“搞管理”的软件。

2025-04-11 15:43:34 1294

原创 STL c++ list——模拟实现

list是一个带头双向循环链表因需要实现一个节点类,其中包含哨兵位(用来标识位置),节点信息(val数据,prev后指针,next后指针)全缺省 T()

2025-04-08 21:14:57 1593 16

原创 C++ STL 详解 ——list 的深度解析与实践指南

list提供了多种灵活的定义方式。可以构造一个空容器,如,用于后续动态添加元素。也能创建一个包含指定数量且值相同的元素的容器,像,这里的lt2就包含了 10 个值为 2 的元素。通过拷贝构造,能复制已有容器的内容,将lt2的内容复制到lt3中。此外,还可以利用迭代器或数组区间来初始化list// 打印各个list的内容return 0;

2025-04-06 20:31:19 1612 31

原创 菜鸟教程 Linux 命令手册深度解析:从基础查询到实战开发全流程指南

Linux 是一款开源的类 Unix 操作系统,它在服务器、云计算、嵌入式系统等诸多领域都有着广泛的应用。对于初学者来说,掌握 Linux 基础操作是迈向 IT 世界的重要一步。Marscode 提供了一个便捷的在线开发环境,让我们无需在本地安装复杂的 Linux 系统,就能随时随地开启 Linux 学习之旅。本文将为你详细介绍如何在 MarsCode IDE 的开发环境中进行 Linux 在线练习,带你快速上手 Linux 基础操作。

2025-04-05 22:30:36 576

原创 C++ 标准库参考手册深度解析

/ 匹配IPv4地址的正则表达式// 实现简单的内存池分配器public:// 从内存池分配内存。

2025-04-05 22:17:58 1058

原创 万字C++STL——vector模拟实现

定义了一个名为iterator的类型别名,它实际上是指向T类型的指针。这意味着iterator可以像指针一样操作,用于遍历和修改vector中的元素。:定义了一个名为的类型别名,它是指向const T类型的指针。使用只能访问vector中的元素,不能修改它们。

2025-03-25 22:03:14 1992 40

原创 理解操作系统(一)冯诺依曼结构和什么是操作系统

角色 对应对象 核心职责学生 用户程序/应用程序 执行具体任务,依赖资源分配辅导员 操作系统内核 直接管理资源,调度进程,确保安全校长 系统策略/管理层 制定规则,全局规划,处理系统级问题。

2025-03-23 17:45:07 703 10

原创 深入剖析 C++ 内存区域划分:从原理到实例(逻辑图)

理解内存区域划分,能让开发者精准掌控变量存储位置,避免内存泄漏、悬空指针等问题。:函数内定义的数组,属于局部变量,存储在栈区,对应选项。:函数内的静态变量,存储在数据段(静态区),对应选项。:静态全局变量,属于数据段(静态区),对应选项。:全局变量,存储在数据段(静态区),对应选项。:指针变量本身是局部变量,存储在栈区(选项。:函数内的局部变量,存储在栈区,对应选项。:指针变量是局部变量,存储在栈区(选项。:局部字符数组,存储在栈区(选项。,存储在代码段(常量区,选项。,存储在代码段(常量区,选项。

2025-03-23 16:42:27 940 7

原创 C语言指针的全面详细解析,涵盖核心概念、代码示例、内存模型图解及常见问题

C语言指针的详细理解

2025-03-21 19:37:11 5061 63

原创 调试器-gdb/cgdb使⽤ 扩展 watch set var 条件断点

watch是 GDB 中一个非常实用的命令,主要用于在程序运行过程中监视特定表达式(通常是变量)的值。一旦被监视的表达式的值发生改变,GDB 就会暂停程序的执行,这样开发者可以及时捕获变量值的变化,进而分析程序的运行状态和可能存在的问题。在调试程序时,普通断点会在每次执行到断点位置时暂停程序,这在某些情况下可能会导致不必要的暂停,浪费调试时间。而条件断点可以根据特定的条件来决定是否暂停程序,这样可以更精准地定位问题,提高调试效率。以下详细介绍添加条件断点的两种常见方式。

2025-03-20 22:02:05 1362 13

原创 深入解析 C++ Vector:全面掌握 STL 核心容器的原理与高效实践

Vector 采用指数增长策略(通常为 1.5 倍或 2 倍),以平衡频繁扩容带来的性能损耗。这种策略保证了均摊时间复杂度为 O (1) 的尾插操作。Vector 是 C++ 标准库中最常用的动态数组容器,其底层基于连续内存存储元素,兼具数组的高效访问与动态扩容的灵活性。在频繁插入元素时,Vector 性能下降明显。在循环中删除元素导致程序崩溃。

2025-03-19 22:10:16 791 11

原创 VS常用快捷键整理

(用加粗标注的是我个人使用时常用的,其实这个全凭个人喜好,大家可以熟悉一下自己喜欢的,都多试。调试.清除所有断点 CTRL + SHIFT + F9 清除项目中的所有断点。编辑.字删除直至结尾处Ctrl + Delete删除插入点右侧的单词。调试.SHIFT + F11跳出执行当前执行点所处函数的剩余行。编辑.转换为大写Ctrl + Shift + U。Windows+Shift+M:还原最小化的窗口。Alt+空格+N 最小化当前窗口。Alt+空格+R 恢复最小化窗口。Alt+空格+X 最大化当前窗口。

2025-03-17 22:21:33 422

原创 string类的模拟实现

将pos及之后的字符向后移动str的长度位,为插入字符串str腾出位置,插入字符串str,并更新_size。先检查位置pos的合法性,如果pos大于等于_size则抛出异常,因为位置超出了字符串的范围,先检查位置pos的合法性,如果pos大于等于_size则抛出异常,因为位置超出了字符串的范围。先检查位置pos的合法性,如果pos大于_size则抛出异常,因为位置超出了字符串的范围。先检查下标i的合法性,如果i大于等于_size则抛出异常,因为下标超出了字符串的范围,

2025-03-16 21:59:24 1256 18

原创 Linux项目自动化构建工具 - make/Makefile 练习 进度条 倒计时

BIN=test:定义变量BIN,代表最终生成的可执行文件名,这里设置为test。:使用wildcard函数获取当前目录下所有扩展名为.c的源文件,将结果赋值给变量SRC。:利用变量替换功能,把SRC中所有.c后缀的文件名替换为.o后缀,得到对应的目标文件列表,赋值给变量OBJ。CC=gcc:定义变量CC,指定使用gcc作为编译器。RM=rm -f:定义变量RM,表示删除文件的命令,-f选项表示强制删除,不询问。

2025-03-16 19:35:58 711

原创 string 常见题目详解——仅仅反转字母 找字符串第一次出现的字符 字符串最后单词长度 验证回文串 字符串相加

若指针指向的不是字母,则将该指针向中间移动,直到找到字母为止。若指针指向的不是字母,则将该指针向中间移动,直到找到字母为止。函数实现了两个以字符串形式表示的非负整数相加的功能,最终返回相加结果的字符串形式。该函数借助数组来统计字符串中每个字母的出现次数,接着再次遍历字符串,找出第一个出现次数为 1 的字符的索引。给定一个字符串,返回“反转后的”字符串,其中不是字母的字符都保留在原地,而所有字母的位置发生反转。如果遍历完整个字符串都没有找到只出现一次的字符,说明不存在这样的字符,返回 -1。

2025-03-15 17:05:07 809

原创 C++ STL 详解 ——vector 的深度解析与实践指南

方式示例代码说明空容器初始容量为 0指定大小与初始值10 个元素,值为 2拷贝构造复制 v2 的内容迭代器范围构造复制区间 [begin, end) 的元素其他容器转换将 string 转换为 vector。

2025-03-14 21:15:27 676 2

原创 C++ 模板初阶总结

typename 或 class 声明模板类型参数。

2025-03-13 14:20:05 504 8

空空如也

空空如也

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

TA关注的人

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