- 博客(72)
- 收藏
- 关注
原创 C++ new 运算符学习笔记
C++动态内存管理摘要:new运算符用于堆内存分配,自动计算大小并调用构造函数,支持单个对象和数组分配(new[]/delete[])。提供多种初始化方式(默认/值/列表初始化),推荐使用智能指针(unique_ptr/shared_ptr)实现RAII管理。需避免内存泄漏、重复释放、悬空指针等问题。对比malloc,new具有类型安全、自动构造/析构等优势。现代C++实践建议优先使用make_unique/make_shared,对于特殊需求可定制operator new或使用定位new...
2025-11-10 16:20:42
624
原创 C++内存模型:高效编程必知要点
摘要:C++内存模型包括栈区(自动管理局部变量)、堆区(动态分配内存)、全局/静态区、常量区和代码区。栈区高效但容量有限,堆区灵活但需手动管理。建议优先使用智能指针和RAII技术,避免内存泄漏和悬空指针。现代C++提倡使用容器和智能指针替代原始指针,注意异常安全和多线程环境下的内存可见性。调试时可重载new/delete跟踪内存分配,优化时需考虑内存对齐和缓存友好性。正确理解内存模型对编写高效安全的C++程序至关重要。
2025-11-10 15:49:02
387
原创 动态规划经典问题学习笔记
本文介绍了动态规划的基本概念和四个经典问题的解法。动态规划通过分解问题、存储子问题解和构建最优解来优化计算效率,适用于具有重叠子问题和最优子结构的问题。文章详细讲解了:1)爬楼梯问题的斐波那契递推解法;2)最长公共子序列问题的二维DP解法;3)编辑距离问题的三种操作转换;4)0/1背包问题的二维状态转移解法。每个问题都给出了完整的C++实现代码,展示了动态规划在实际问题中的应用。
2025-10-21 15:20:18
520
原创 分治算法之合并排序
本文介绍了由约翰·冯·诺依曼提出的归并排序算法。该算法采用分治法思想,通过递归将数组拆分为最小单元(单个元素),再将有序子数组合并。核心流程包括:拆分(递归划分)、合并(比较填充临时数组)。C++实现展示了递归排序和合并操作。算法特性:时间复杂度稳定为O(nlogn),空间复杂度O(n),具有稳定性,适用于大规模数据处理。相比快速排序,归并排序更稳定但空间消耗更大,是小规模数据排序的优选方案。该算法是分治法的经典应用,体现了高效稳定的排序特点。
2025-09-30 07:00:00
713
原创 分治算法之二分搜索-递归与迭代双解法
摘要:本文系统介绍了二分搜索算法的两种实现方式。递归版通过函数调用栈实现分治策略,代码简洁但存在栈溢出风险,时间复杂度O(logn),空间复杂度O(logn);迭代版使用循环手动维护搜索范围,空间复杂度优化为O(1)。对比分析显示,递归版适合教学演示,迭代版更适合工程实践。文中详细解析了C++中const vector<int>&参数传递的效率和安全性优势,并提供了完整的代码实现。建议在小规模数据时使用递归版,大规模数据优先选择迭代版实现。
2025-09-29 07:00:00
1916
原创 贪心算法之“霍夫曼编码”问题
霍夫曼编码问题是一种数据压缩方法,通过为高频字符分配短编码、低频字符分配长编码实现无损压缩。本文详细解析了霍夫曼编码的实现过程,包括核心结构体定义(HuffNode和HuffCode)、全局变量说明、关键函数逻辑(构建霍夫曼树和生成编码)以及程序使用示例。文章还分析了代码特点(结构清晰、逻辑严谨)和使用注意事项(输入校验、数组大小限制等)。该算法由David Huffman于1952年提出,能有效减少数据存储空间,广泛应用于文件压缩等领域。
2025-09-24 08:00:00
552
原创 贪心算法之会议安排问题
会议安排问题是一个经典的资源调度优化问题,核心目标是在单个会场中安排尽可能多的会议,且各会议时间不重叠。本文提出基于贪心算法的解决方案:优先选择结束时间最早的会议,若结束时间相同则选择开始时间最晚的会议。该策略通过排序和遍历两个阶段实现,时间复杂度为O(nlogn),空间复杂度为O(n)。算法适用于单资源调度场景,如会议室安排、设备使用等,但不支持多资源调度或带优先级的会议安排。通过结构体存储会议信息并设计合理的比较函数,确保高效实现最优解。
2025-09-23 19:00:00
1317
4
原创 贪心算法之分数背包问题
分数背包问题是经典的资源优化问题,其核心在于允许将物品分割装入背包,目标是最大化背包总价值。与0-1背包问题的关键区别在于可分割性,使其能用贪心算法获得最优解:优先装入单位价值最高的物品,能完整装则装,装不下则装入部分。算法通过计算物品单位价值并降序排序,再按序装入背包。时间复杂度为O(nlogn),适用于资源分配等可分割场景,但不适用于物品不可分割或有依赖关系的情况。
2025-09-23 18:00:00
1075
原创 贪心算法之船舶装载问题
船舶装载问题采用贪心算法求解,通过"每次选择最轻物品"策略实现装载数量最大化。优化后的C++代码使用vector存储数据,分离输入与计算逻辑,时间复杂度为O(nlogn)。核心步骤包括:重量排序、顺序装载、载重检测。代码改进体现在动态数组、输入验证和模块化设计,提升了安全性和可维护性。该算法适用于中等规模数据,体现贪心算法"局部最优→全局最优"的特性。
2025-09-23 13:21:41
1004
原创 结构体案例1:教师学生管理系统
本文展示了一个教师-学生信息管理系统的C++实现。程序使用嵌套结构体定义教师(含姓名和5名学生数组)和学生(含姓名和50-100随机分数)的数据结构。核心功能包括:1)通过allocatSpace函数初始化教师和学生数据,使用"ABCDE"种子生成规范化姓名;2)printInfo函数格式化输出信息。主程序创建3名教师数组,动态计算长度后调用初始化函数,最后打印结果。特点包括:层级数据结构、随机分数生成、静态内存管理,但存在Windows平台依赖。示例输出展示了教师及其学生信息的标准格式
2025-09-17 11:14:49
189
原创 C++零基础第八天:结构体从入门到精通
本文系统介绍了C++结构体的核心概念与应用。主要内容包括:1)结构体的基本定义和使用方法,展示如何将不同类型数据组合成整体;2)结构体变量的三种创建与初始化方式;3)通过成员运算符访问结构体数据;4)结构体数组、指针及嵌套结构的应用;5)结构体作为函数参数的两种传递方式(值传递和地址传递)及性能对比;6)const修饰指针参数的保护机制。文章通过学生信息管理等实例,详细说明了结构体在组织复杂数据、提高代码可读性和程序效率方面的优势,是处理关联数据的有效工具。
2025-09-16 12:09:41
502
原创 古董装载优化:30秒破解重量限制
该代码实现古董装载问题的贪心算法求解。核心思路是对古董重量升序排序后,依次累加直至超过总重量限制W=30.0。主要包含:1) w数组存储重量,solve1函数实现累加计数;2) 主函数完成输入、排序和结果输出。改进建议包括输入验证、vector动态内存及函数模板化。示例输入8件古董,排序后从最小开始累加,输出最大可装载数量(如输入1.9,2.8...时输出5件,总重17.6≤30)。算法时间复杂度O(nlogn),主要来自排序操作。
2025-09-10 17:19:51
258
原创 C++零基础第七天:指针从入门到精通
本文介绍了C++指针的核心概念与应用。主要内容包括:指针的基本概念与内存地址存储功能;指针变量的定义和使用方法;指针在不同操作系统下的内存占用情况;空指针和野指针的特性及注意事项;const修饰指针的三种方式及其区别;指针与数组、函数的结合应用,包括通过指针操作数组元素和实现函数参数传递;最后通过冒泡排序案例展示了指针、数组和函数的综合运用。文章通过具体代码示例详细说明了指针的各种用法和注意事项。
2025-09-10 17:15:27
878
原创 C++零基础第六天:从函数定义到分文件编写
本文介绍了C++函数的核心概念与使用方式。主要内容包括:函数的定义与调用方法,值传递的特性(形参不影响实参),四种常见函数样式(无参无返、有参无返、无参有返、有参有返),函数声明的作用及规则,以及函数分文件编写的实现步骤。通过多个示例代码演示了加法函数、交换函数等具体实现,说明了函数在代码复用和模块化编程中的重要性。文章系统性地讲解了从函数基础到进阶应用的知识点,为C++初学者提供了清晰的函数学习路径。
2025-09-08 17:50:20
283
1
原创 C++零基础第五天:数组核心知识与实战技巧
本文介绍了数组的基本概念和操作方法。数组是存储相同类型数据的集合,具有连续内存存储的特点。主要内容包括:一维数组的三种定义方式(预先声明长度、初始化赋值、省略长度声明)及其基本操作;一维数组名的两个用途(计算内存大小和获取首地址);冒泡排序算法的实现原理和代码示例。此外还介绍了二维数组的四种定义方式及其内存特性,以及二维数组名的用途(查看内存空间和获取地址)。文章通过具体代码示例展示了各种数组的定义、初始化和基本操作。
2025-09-07 15:47:40
302
原创 C++ 小游戏:拍桌子
摘要:本文解析了一个C++程序,用于统计1到100报数游戏中需要"拍桌子"的次数(遇7的倍数或含数字7时)。程序通过循环遍历数字,使用条件判断筛选符合条件的数字,并用计数器累计30次"拍桌子"。文章详细介绍了代码结构、核心逻辑和验证方法,完整代码展示了从变量定义到结果输出的全过程。该程序演示了基础的循环和条件判断应用,可用于类似数字游戏的统计场景。
2025-09-06 19:08:08
906
原创 C++零基础第四天:顺序、选择与循环结构详解
本文介绍了C/C++程序的三大基本结构及其实现方式。1)顺序结构:代码按书写顺序执行;2)选择结构:包括if语句(单行、多行、多条件)、三目运算符和switch语句,用于条件分支控制;3)循环结构:包含while、do-while、for循环及嵌套循环,用于重复执行代码块。此外还讲解了跳转语句:break用于终止结构执行,continue跳过当前循环,goto实现无条件跳转(需慎用)。通过具体示例展示了各结构的语法特点和适用场景,并强调了避免死循环、case穿透等常见问题的注意事项。
2025-09-06 18:44:04
925
原创 C++零基础第三天:运算符详解
本文详细介绍了C++中常用的运算符类型及其用法。主要内容包括:算术运算符(加减乘除、取模、递增递减),强调整数除法会舍弃小数部分,取模运算仅适用于整数;赋值运算符(=、+=等)的多种形式;比较运算符(==、!=等)返回布尔值的特性;以及逻辑运算符(!、&&、||)的真值判断规则。通过代码示例展示了各类运算符的具体应用场景和使用注意事项,如除数不能为零等常见错误。全文系统性地梳理了C++运算符的核心知识,为程序设计中的运算操作提供了实用指导。
2025-09-04 13:54:24
612
原创 C++零基础第二天:数据类型详解
本文系统介绍了C++中的基本数据类型及其应用。主要内容包括:整型(short/int/long/long long)的存储空间和取值范围;浮点型(float/double)的有效数字范围和科学计数法;字符型的ASCII编码存储原理;字符串的C风格和C++风格定义;布尔型的真假表示;以及sizeof运算符和cin输入方法的使用。通过代码示例详细演示了各类型变量的声明、初始化和操作,强调了数据类型选择对内存优化的重要性,为C++基础编程提供了全面的数据类型参考指南。
2025-09-04 11:00:29
1273
原创 C++零基础第一天:从Hello World到变量常量
本文介绍了C++编程基础,主要包括:1.基本输出语句"helloword"的代码实现及关键语法说明;2.单行和多行注释的使用方法及作用;3.变量的定义、初始化及使用示例;4.两种定义常量的方式(#define宏常量和const修饰变量)及其区别;5.关键字的使用限制和标识符命名规则,包括命名规范和常见错误示例。全文通过具体代码示例详细讲解了C++基础语法要点,适合初学者快速掌握编程基础。
2025-09-03 17:11:53
378
原创 高效解耦:自定义内核链表实现指南(简化版)
本文介绍了一个自定义内核链表的实现方法,采用模块化设计将通用链表操作与用户数据分离。通用链表模块(kernelList.h/.c)仅处理链表节点的基本操作(初始化、增删),完全独立于具体数据类型。用户数据模块(data.h/.c)通过宏定义实现从链表节点到数据结构的反向查找。测试代码(main.c)展示了如何使用这两个模块的接口来管理数据链表。这种解耦设计提高了代码复用性,新增数据类型时只需实现对应的数据模块,无需修改链表核心代码,体现了良好的软件工程实践。
2025-08-12 18:00:00
537
原创 C语言基础第25天:深入解析双向循环链表实现
本文介绍了双向循环链表的实现原理与操作。双向循环链表的特点是尾节点指向头节点形成循环结构,相比单链表能双向遍历但占用更多内存。文章详细展示了C语言实现代码,包括创建链表、插入删除节点、查找更新等核心操作,并提供了头文件和测试示例。分析了双向循环链表的优缺点:插入删除快(O(1))但查找慢(O(n)),适用于频繁增删、需要双向操作的场景。最后简要介绍了Linux内核链表的通用设计思路,通过分离指针域和数据域实现高度复用。本文内容涵盖从基础实现到高级应用,为理解链表数据结构提供了完整参考。
2025-08-12 14:00:00
333
原创 C语言基础第24天:链表操作之 NODE* 与 NODE** 详解
本文详细介绍了C语言中单指针(NODE*)和双指针(NODE**)在链表操作中的区别与应用。单指针用于访问和修改节点内容,而双指针则用于修改链表结构本身。重点阐述了双指针在修改头节点时的必要性,并提供了对应的代码示例。文章还深入讲解了双向循环链表的实现,包括节点设计、增删改查等基本操作,并分析了双向链表的优缺点及其适用场景。通过对比单链表,说明了双向链表在需要频繁逆向操作时的优势,如浏览器历史记录等应用场景。
2025-08-12 09:20:19
591
原创 C语言基础第23天:单链表从原理到实现
本文介绍了单链表的基本概念和实现方法。单链表是一种链式存储的线性表,通过指针将离散存储的数据节点串联起来。文章详细阐述了链表的分类(单向、循环、双向等),重点讲解了单链表的基本操作,包括节点设计、创建链表、头插法/尾插法插入节点、中间插入、遍历查找、更新删除节点等。通过C语言代码示例展示了链表操作的实现细节,包括内存分配、指针操作和错误处理等关键点,并提供了完整的头文件、实现文件和测试用例。文章强调链表相比顺序表在插入删除操作上的优势,同时也指出了链表在内存管理和指针操作上的复杂性。
2025-08-11 20:15:43
232
原创 C语言增删查改实战:高效管理顺序表
本文实现了一个有序顺序表,支持插入正整数和删除负整数的绝对值操作。程序通过结构体定义顺序表,包含初始化、销毁、查找、插入、删除和显示功能。插入时自动按升序排列,每次操作后打印当前表内容。顺序表优点是存储密度高、随机访问快,缺点是增删数据需要大量移动元素,且需要预先分配连续内存空间。该实现展示了顺序存储结构在动态数据操作中的局限性,适合数据量固定且查询频繁的场景。
2025-08-11 20:05:46
708
原创 C语言基础第22天:数据结构与算法
本文介绍了数据结构的基本概念和实现方法。数据结构是计算机存储、组织数据的方式,可分为线性结构(数组、链表等)和非线性结构(树、图等)。文章重点分析了算法的时间复杂度和空间复杂度,指出程序性能优化的核心在于平衡时空效率。随后详细讲解了线性表的顺序存储实现,包括顺序表的初始化、插入、删除、扩容等操作,并提供了完整的C语言实现代码。通过示例程序演示了顺序表的基本操作和内存管理,展现了数据结构在实际编程中的应用。
2025-08-11 19:59:40
785
原创 C语言基础第21天:预处理与文件操作详解
本文介绍了C语言预处理机制和文件I/O操作。预处理部分详细讲解了条件编译的三种语法形式(#ifdef、#ifndef、#if)和文件包含机制,包括标准库和自定义文件的包含方式、头文件保护技巧等。文件I/O部分阐述了文件概念、分类、缓冲机制,以及文件操作的基本步骤,重点介绍了fopen/fclose函数的使用方法和各种文件打开模式。文章还详细说明了单字符读写(fgetc/fputc)和行读写(fgets/fputs)等文件顺序读写操作,为C语言文件处理提供了实用指导。
2025-08-05 20:21:02
497
原创 深入了解 system (“cls“):控制台清屏的简单实现与潜在问题
本文介绍了C/C++中使用system("cls")清空控制台的方法及其应用。作为Windows平台常用的清屏命令,它通过执行系统命令实现简单快捷的屏幕清理,适用于菜单系统、游戏界面等场景。但存在平台依赖性、性能开销等问题。文章提供了跨平台解决方案(区分Windows的cls和类Unix的clear)及更高效的API替代方案(Windows API和类Unix终端控制)。开发者应根据项目需求(开发速度、跨平台性、性能)选择最适合的清屏方式。
2025-08-05 09:16:41
552
1
原创 高效洗牌:Fisher-Yates算法详解
Fisher-Yates算法是一种高效、公平的随机打乱算法,由统计学家Fisher和Yates于1938年提出。该算法通过从数组末尾开始,将每个元素与前面随机位置的元素交换,保证每个元素出现在任意位置的概率均等。相比其他方法,它具有O(n)时间复杂度和O(1)空间复杂度,适用于洗牌、随机排序等场景。文章以斗地主洗牌程序为例展示了具体实现,并强调了随机数生成器初始化和避免数组越界等注意事项。Fisher-Yates算法是处理随机排列问题的理想选择。
2025-08-04 16:46:07
1592
原创 C语言第20天:使用枚举与 typedef 提升代码可读性的关键技巧
本文介绍了C语言中枚举类型和typedef的用法。枚举类型用于定义一组相关联的常量,如月份、星期等,提高代码可读性,枚举元素默认从0开始递增,也可手动指定初始值。枚举类型支持三种定义方式:先定义类型后定义变量、定义类型同时定义变量、直接定义枚举变量。typedef用于给已有类型重命名,特别适用于复杂数据类型(如结构体),可增强代码可移植性,示例如size_t的typedef定义。文章通过具体代码演示了枚举和typedef的实际应用场景和语法特点。
2025-08-04 11:51:41
281
原创 C语言基础:枚举类型相关知识点代码及简单案例
该代码演示了C语言中枚举和结构体的使用。枚举部分展示了如何定义枚举类型、访问枚举元素、初始化枚举变量,并通过一个剪刀石头布游戏案例说明枚举的实际应用。结构体部分详细说明了结构体的定义方式、类型重命名(typedef)方法,以及如何访问结构体成员(包括直接访问和通过指针访问)。代码还包含一个学生信息管理的案例,展示了结构体数组和指针的使用。这些示例涵盖了枚举和结构体的基本语法和常见应用场景。
2025-08-04 11:31:05
203
原创 C语言基础:动态申请练习题
该文档包含4个C语言动态内存操作示例:1)动态申请float数组,拷贝数据并查找特定值(12.35)首次出现的位置;2)动态申请整型数组,删除第3个元素并调整内存;3)动态申请整型数组,在第4个位置后插入新元素100;4)实现memmove函数,处理内存重叠区域的拷贝。每个示例都包含完整的内存申请、操作、输出和释放过程,展示了动态数组的基本操作方法和内存管理要点。
2025-08-03 11:00:35
204
原创 C语言基础:共用体、联合体相关知识点
本文介绍了共用体(联合体)的概念和使用方法。共用体是一种多个变量共享同一内存空间的数据结构,其大小由最大成员决定。语法与结构体类似,支持定义变量、初始化成员、作为参数和返回值等操作。但共用体同一时间只能存储一个值,存取操作可能导致数据覆盖,因此建议谨慎使用。文中通过代码示例演示了共用体的定义、嵌套使用,以及与结构体的区别:结构体成员独立存储可同时访问,而共用体共享内存空间,适用于需要节省内存但不同时访问各成员的场景。最后强调应保持存取时使用相同成员以避免数据错误。
2025-08-03 10:35:04
628
原创 C语言基础:结构体的常见陷阱与最佳实践
摘要:结构体常见陷阱包括成员越界访问、内存泄漏、悬挂指针和大小计算错误。最佳实践建议:使用typedef简化语法,合理组织数据,分解大型结构体,正确使用指针并注意内存管理。这些技巧能有效避免结构体使用中的常见问题,提高代码安全性和可维护性。
2025-08-03 10:25:45
300
原创 C语言基础第19天:构造类型
本文系统介绍了C语言中的构造类型数据结构,重点讲解了结构体的定义与使用。主要内容包括:1)结构体定义语法与三种变量定义方式;2)结构体成员的访问方法(.和->操作符);3)结构体数组的定义与遍历;4)结构体指针的使用;5)字节对齐规则及#pragma pack指令;6)柔性数组的特性与应用。通过实例代码演示了结构体在实际编程中的应用,如学生信息管理、投票统计系统等。文章还详细分析了结构体在内存中的对齐机制,帮助开发者优化内存使用效率。
2025-08-02 11:46:35
1105
原创 C语言基础第18天:内存操作函数
本文介绍了C语言中常用的内存操作函数及其使用方法。主要包含四个函数:1) memset用于内存填充,可将指定内存区域初始化为特定值;2) memcpy和memmove实现内存拷贝,后者能处理内存重叠情况;3) memcmp用于内存比较,按字节对比两个内存区域;4) memchr和memrchr(GNU扩展)用于内存查找特定字符。每个函数都详细说明了头文件、函数原型、参数、返回值及注意事项,并提供了示例代码演示具体用法。这些函数是C语言进行内存操作的基础工具,在内存管理、数据初始化和处理中具有重要作用。
2025-07-31 20:22:32
860
原创 C语言基础第18天:动态内存分配
C语言动态内存分配摘要:介绍了C语言中动态内存分配的基本概念和常用函数,包括malloc、calloc、realloc和free。动态内存分配在堆区进行,需程序员手动管理内存回收。重点讲解了各函数的使用方法、参数说明及注意事项,如内存初始化、指针校验、内存释放等。通过示例代码演示了如何正确申请、使用、扩容和释放动态内存,强调了防止内存泄漏和野指针的重要性。特别指出realloc的两种扩容机制及free后的指针置空操作,为C语言动态内存管理提供了实用指导。
2025-07-31 20:06:21
452
原创 C语言基础第17天:二级指针、main函数参数、常量指针和void指针的使用
本文摘要:C语言指针进阶应用指南重点解析了二级指针、main函数参数、常量指针和void指针的使用。主要内容包括:1. 二级指针的定义与解引用方法,以及与指针数组的等效性;2. main函数的多种定义格式和参数(argc,argv)的使用;3. 常量指针与指针常量的区别与应用场景;4. void*万能指针的特性及类型转换注意事项;5. 野指针的危害及防范措施。文章通过具体代码示例,详细说明了各类指针的操作技巧和适用场景,为C语言开发者提供了指针高级应用的实用参考。
2025-07-30 19:58:40
810
原创 C 语言基础第16天:指针补充
本文深入解析C语言中指针的高级应用,包括数组指针与指针数组的区分与使用、字符数组与字符指针的特性对比、指针函数和函数指针的运用技巧,以及二级指针的操作方法。重点阐述了数组指针如何指向完整数组、指针数组管理多个独立指针的特点,并详细比较了两者的定义、内存分配和使用场景。同时探讨了字符串的两种存储方式差异,函数指针实现回调函数的机制,以及二级指针的解引用规则。通过实例讲解,帮助读者掌握指针的核心概念和灵活运用技巧,提升程序效率和可读性。
2025-07-29 18:20:35
393
原创 C语言基础第15天:从数组指针到指针函数
本文详细讲解了C语言中指针的核心概念,包括数组指针、指针数组、字符数组与字符指针的区别以及指针函数的用法。数组指针指向整个数组,而指针数组则是存储多个指针的数组,两者在定义和使用上有明显差异。字符数组是固定内存空间,字符指针则可改变指向。文章还介绍了指针函数的正确使用方法,强调避免返回局部变量地址导致野指针问题。通过具体代码示例和对比分析,帮助读者深入理解这些关键概念及其应用场景,为掌握C语言指针编程打下坚实基础。
2025-07-28 20:28:41
775
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅