自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C++ 类和对象4---(初始化列表,类型转化,static成员)

本文深入讲解了C++中的三个重要特性:构造函数初始化列表、类型转换和static成员。初始化列表部分详细介绍了其语法、核心特性(如初始化时机、必须使用场景)和初始化逻辑,通过Date类示例展示了实际应用。类型转换部分重点分析了内置类型到类类型和类类型之间的隐式转换机制,包括语法形式、核心特性和explicit关键字的作用。static成员部分则阐述了静态成员变量(类外初始化、共享性)和静态成员函数(无this指针、类级访问)的特点和使用方法。全文通过丰富示例帮助读者理解这些核心概念的实际应用场景和注意事项。

2025-08-13 23:15:00 711

原创 C++ 类和对象的应用之日期项目的实现(三万字详解)

本文通过实现一个日期类项目,详细讲解了C++类和对象中的6个默认成员函数及其应用。文章分为三个部分:头文件(Date.h)定义日期类接口,实现文件(Date.cpp)完成具体功能,测试文件(test.cpp)验证各类操作。 在日期类中,我们实现了: 构造函数与日期合法性检查 日期加减运算(+、+=、-、-=) 自增自减操作(++、--) 日期比较运算符(>、<、==等) 日期差值计算(两个日期相差天数) 输入输出流重载(<<、>>) 每个功能都结合具体代码示例详细说明,包

2025-08-13 09:30:38 181

原创 C++ 类和对象(3)

本文系统讲解了C++中类的6个默认成员函数,重点剖析了拷贝构造函数和赋值运算符重载。拷贝构造函数用于用已存在对象初始化新对象,需注意参数必须是常量引用以避免递归调用。编译器默认生成浅拷贝版本,当类包含动态内存时需手动实现深拷贝。赋值运算符重载用于已有对象间的赋值操作,参数建议使用const引用以提升效率。当类包含动态资源时,必须手动重载以避免内存问题。此外,文章还介绍了取地址运算符重载的普通版和const版本,以及const成员函数的本质。6个默认成员函数共同构成了C++对象生命周期的自动管理体系,为对象的

2025-08-11 14:27:09 625

原创 C++ 类和对象(2)

C++类的默认成员函数包括6个特殊函数:构造函数、析构函数、拷贝构造、赋值重载和两个取地址重载。核心作用是支持对象的基础操作,如创建、销毁、复制等。构造函数在对象创建时初始化成员,可重载为无参/带参形式;析构函数在对象销毁时释放资源,遵循"先构造后析构"的顺序。编译器会为未显式定义这些函数的类生成默认实现,但内置类型成员不会被默认构造初始化。当类涉及动态资源管理时,必须手动定义构造/析构函数以避免资源泄漏。这些默认函数是C++面向对象编程的基础机制,保障了对象的完整生命周期管理。

2025-08-07 20:44:07 988

原创 C++ 类和对象(1)

摘要:本文系统讲解C++面向对象编程中类和对象的核心概念。重点包括:1)类的定义与封装特性,通过访问限定符控制成员可见性;2)类实例化过程,对象内存分配与this指针机制;3)类对象大小计算方法及内存对齐规则;4)通过Stack类的C++/C实现对比,展示封装带来的代码安全性和可维护性提升。文章详细剖析了类作为"数据+行为"封装体的本质,以及this指针在成员函数中的隐式传递机制,为掌握C++面向对象编程奠定基础。

2025-08-05 22:59:32 682 1

原创 C++ 入门基础(4)

本文介绍了C++中的内联函数(inline)和nullptr两个重要特性。内联函数通过编译期替换函数体减少调用开销,适用于短小高频调用的函数,相比宏更安全且具有类型检查。文章详细讲解了内联函数的原理、语法、使用场景和注意事项,并对比了其与宏的区别。nullptr是C++11引入的类型安全的空指针表示方式,解决了NULL可能导致的类型混淆问题,可以隐式转换为任意指针类型。文章建议在C++编程中优先使用内联函数替代宏,并使用nullptr表示空指针以提高代码安全性和可读性。

2025-08-04 21:06:32 883

原创 C++ 入门基础(3)

本文介绍了C++中函数重载和引用的核心概念与用法。函数重载允许同名函数通过参数(个数、类型、顺序)区分,实现静态多态,但不能仅靠返回值不同重载。引用是变量的别名,必须初始化且不可重新绑定。传引用可作为函数参数或返回值,避免拷贝提升效率;常引用可保护数据;指针引用可修改指针指向。重点强调:返回引用时需确保目标变量生命周期足够长,绝对避免返回局部变量引用。合理使用函数重载和引用能提升代码简洁性和运行效率。

2025-08-03 23:23:03 1130

原创 C++ 入门基础(2)

本文详细介绍了C++中的三个基础核心概念:命名空间、输入输出和缺省参数。命名空间通过分组隔离标识符,有效解决命名冲突问题;C++的I/O系统基于iostream库,使用cin/cout实现类型安全的输入输出;缺省参数允许函数参数预设默认值,提高代码灵活性。文章深入解析了这些特性的定义、用法、规则及注意事项,强调正确使用命名空间避免冲突、合理运用缺省参数简化调用等最佳实践,为C++初学者奠定重要基础。这些概念是掌握C++编程的关键第一步,需要重点理解和熟练运用。

2025-07-31 22:22:35 1136

原创 C++ 入门基础(1)---C++简介

C++是由Bjarne Stroustrup在C语言基础上开发的编程语言,自1983年命名以来经历了C++98、C++11、C++20等多个标准版本迭代。它兼容C语言语法,同时扩展了面向对象、泛型编程等特性,兼具高效执行和复杂项目开发能力。C++广泛应用于系统开发、游戏引擎、音视频处理、嵌入式系统、AI底层框架等领域,在TIOBE排行榜中长期位居前列。其标准模板库(STL)提供了丰富的容器和算法,智能指针优化了内存管理,使数据结构实现更加便捷。学习C++能培养底层编程思维,提升在游戏开发、嵌入式等高薪岗位的

2025-07-31 11:23:56 570

原创 数据结构 排序(2)---选择排序

本文介绍了选择排序算法的两种实现方式:直接选择排序和堆排序。直接选择排序通过每次选取未排序区间的最小值和最大值,分别交换到数组两端来实现排序,虽然简单直观但时间复杂度固定为O(n²)。堆排序则利用堆结构高效获取最值,将时间复杂度优化至O(nlogn)。文章详细解析了直接选择排序的代码实现、运行流程和复杂度分析,并对比了升序与降序的实现差异。选择排序适用于小规模数据排序,其中堆排序在大数据场景下更具优势。两种算法都体现了"选最值、放到位"的核心思想。

2025-07-29 22:01:57 766

原创 数据结构 排序(1)---插入排序

排序,是将一组数据记录(可以是数字、文字描述、商品信息、院校数据等各类可比较的内容 ),依据某个或多个“关键字”(如商品价格、院校总分、数字大小等 ),按照升序(从小到大)或降序(从大到小 )的规则重新排列的操作。简单来说,就是让杂乱的数据变得“有序”,方便后续查看、分析与使用。下面我们在编译器上对上面的两个排序和冒泡排序(冒泡排序小编之前有讲过所以直接用来测试)进行一个测试:我们可以看出,排序之前的数据是乱序的,经过排序之后全部变为了有序数组。从而也验证了我们在实现上述排序是正确的。

2025-07-29 19:27:45 1110

原创 数据结构 堆(4)---TOP-K问题

本文介绍了堆在TOP-K问题中的应用。TOP-K问题指从海量数据中找出最大(或最小)的前K个元素,具有数据量大且K远小于n的特点。通过小顶堆(找前K大)或大顶堆(找前K小)的筛选机制,只需维护K个元素的堆结构,即可高效过滤无关数据。该方法时间复杂度为O(nlogK),空间复杂度仅O(K),显著优于全排序方案,适用于排行榜、实时监控等场景。文章详细推导了思路逻辑,提供了代码实现,并分析了复杂度及应用优势,是处理海量数据筛选的高效解决方案。

2025-07-27 22:46:30 806

原创 数据结构 二叉树(3)---层序遍历二叉树

我们仍然以之前使用过的二叉树为例。对于二叉树而言 :层序遍历二叉树,简单说就是按“层次”访问节点:从根节点开始,先访问第1层(根),再访问第2层(根的左右孩子),接着第3层……逐层从左到右访问每个节点,直到所有节点都被访问。所以对于这棵二叉树而言,我们可以简单的推论出这棵二叉树的层序遍历就是 :A BlevelOrder 函数通过队列实现二叉树层序遍历,核心总结如下:1. 初始化队列并将根节点入队,作为遍历起点;2. 循环处理队列(队列非空时):- 取出队头节点,访问其数据(打印)

2025-07-26 23:06:17 673

原创 数据结构 二叉树(2)---二叉树的实现

含义:用 typedef 给 char 起别名 BTDataType ,统一管理二叉树节点存储的数据类型。- 好处:如果后续想把节点数据改成 int / double 等,只需改这一行,不用满代码找 char 替换。// 存储节点的值(类型是上面定义的 BTDataType,即 char)// 指向左子树节点的指针(递归定义,因为子树也是 BinaryTreeNode 类型)// 指向右子树节点的指针}BTNode;:存当前节点的数据(比如字符 'A' 、 'B' 等)。

2025-07-26 18:27:22 1415

原创 数据结构 二叉树(1)

/定义链式结构的二叉树// 当前结点值// 指向当前结点左孩子// 指向当前结点右孩子}BTNode;- 作用:用 typedef 定义二叉树结点的结构体 BTNode ,每个结点包含:- 1 个数据域 data (类型为 BTDataType ,已通过 typedef 设为 int ),存储结点的值。- 2 个指针: left (指向左子树)、 right (指向右子树),体现二叉树的链式存储。

2025-07-25 22:07:56 938

原创 数据结构 堆(3)---堆排序

借助独立堆结构,用‘先存后取’的逻辑实现排序”,核心特点如下:先将原数组元素逐个插入独立堆结构(通过 HPPush 建堆,维持大堆/小堆特性),再循环提取堆顶元素(极值),按顺序覆盖原数组,最终完成排序。- 依赖额外堆结构存储数据,空间复杂度 O(N) (堆需存一份与原数组等长的数据)。- 逻辑直观,无需手动处理复杂的数组索引调整,通过堆的封装函数( HPPush / HPPop )简化操作。由堆类型决定:小堆+前→后填充→升序;大堆+前→后填充→降序。

2025-07-24 14:52:31 1104 1

原创 数据结构 堆(2)---堆的实现

/ 存储堆数据的动态数组int size;// 堆中有效元素个数(当前堆的大小)// 数组总容量(空间大小,避免频繁扩容)}HP;- HPDataType :用 typedef 把 int 重命名为 HPDataType ,方便后续修改堆存储的数据类型(如改成 float /自定义结构体,只需改这里 )。- arr :动态数组,底层用数组模拟堆结构(完全二叉树按层序存储特性,可通过下标快速找父子节点 )。- size :记录当前堆中有多少个元素,决定堆的有效范围。

2025-07-22 23:33:22 976

原创 数据结构 堆(1)

从今天开始,我们要学习一种新的数据结构——堆。首先学习堆的前提是要了解并掌握堆的"祖先"——树,为什么这样说呢?这就要涉及到二者之间的联系。简单来说,如果把树比作一个大家庭,那么堆就像是这个大家族里的一个分支家族。只有先掌握了树的基本概念,进而才能更好的了解堆。

2025-07-22 20:26:11 1017

原创 数据结构 队列

本文详细介绍了队列的数据结构实现,包括概念、链表实现方式及具体代码分析。队列是一种遵循先进先出(FIFO)原则的线性表,采用链表结构实现优于数组,能有效避免数组队列的"假溢出"问题。文章从三个文件(Queue.h、Queue.c、test.c)的角度展开:头文件定义队列结构体和操作接口;实现文件完成初始化、销毁、入队出队等核心功能;测试文件验证队列操作的正确性。重点分析了各函数的时间复杂度,指出入队出队操作为O(1)的高效特性,并讨论了两种统计队列长度方法的适用场景。这种模块化设计体现了

2025-07-19 23:00:35 940

原创 数据结构 栈(2)--栈的实现

本文详细介绍了栈的数据结构实现,采用C语言通过三个文件(头文件、实现文件和测试文件)完成。头文件(Stack.h)定义了栈的结构体(基于动态数组)和核心操作函数声明;实现文件(Stack.c)具体实现了初始化、入栈、出栈、判空、取栈顶等操作,并分析了各函数的时间/空间复杂度;测试文件(test.c)通过完整生命周期测试验证了栈的功能。文章重点解析了栈的动态扩容策略(初始容量4,后续翻倍)、"后进先出"特性以及三者协同关系,体现了接口与实现分离的设计思想。相比顺序表和链表,栈的实现更简洁,

2025-07-17 23:10:05 1057

原创 数据结构 栈(1)

之前几篇我们分别讲解了顺序表和单链表的内容,今天我们又来学习一个新的关于数据结构的内容--- 栈。栈:栈也属于线性表 , 但它是一种特殊的线性表,压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除操作叫做出栈。出数据也在栈顶。栈底层结构选型:栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。

2025-07-17 21:05:45 983

原创 数据结构 双向链表(2)---双向链表的实现

本文详细介绍了双向链表的C语言实现,分为头文件(.h)、实现文件(.c)和测试文件(.c)三个部分。头文件定义了链表结构和基本操作接口;实现文件具体实现了节点创建、初始化、插入(头插/尾插/指定位置插入)、删除(头删/尾删/指定位置删除)、查找、销毁等核心功能;测试文件验证了各项功能的正确性。双向链表通过prev和next指针实现双向遍历,配合哨兵位头节点简化操作,具有O(1)时间复杂度的插入删除优势,但存在额外空间开销。完整代码展示了如何通过指针调整维护双向连接关系,适用于需要频繁双向操作的场景如队列和历

2025-07-16 20:47:46 1200

原创 数据结构 双向链表(1)

本文介绍了链表的分类和双向链表的特点。链表按单向/双向、带头/不带头、循环/不循环三个维度可分为8种结构,实际最常用的是无头单向非循环链表和双向带头循环链表。双向链表(DoublyLinkedList)每个节点包含数据域、前驱指针和后继指针,通常带有不存储有效数据的哨兵位头节点,形成双向循环结构。这种结构使链表具备双向遍历能力,在插入删除操作时更为简便。文章还预告将在后续内容中详细介绍双向链表的代码实现和各种操作。

2025-07-16 18:11:07 974

原创 数据结构 单链表(2)--单链表的实现

本文详细介绍了单链表的C语言实现过程。通过头文件、实现文件和测试文件三个模块,系统讲解了单链表的核心结构与基础操作。主要内容包括:1. 定义链表节点结构体和数据类型;2. 实现创建节点、打印链表等基础功能;3. 完成头部/尾部插入删除等核心操作;4. 实现查找、指定位置操作等高级功能;5. 分析各操作的时间/空间复杂度;6. 通过测试文件验证功能正确性。文章特别强调了二级指针的使用场景,对比了链表与顺序表的性能差异,并提供了完整代码实现。该实现体现了模块化编程思想,适合数据结构学习者参考。

2025-07-13 23:50:08 1156

原创 数据结构 单链表(1)

表示链表结束。2. 「火车头」=「链表头指针」火车头(车头本身也算一节特殊车厢)→。

2025-07-13 19:05:37 760

原创 数据结构 顺序表(3)---顺序表的应用

在之间的两篇文章中,我们着重讲了顺序表及顺序表的实现。今天这篇文章我们将简单讲解关于顺序表的三个算法题。这三个题也都属于力扣上的经典例题。

2025-07-11 22:43:52 1074

原创 数据结构 顺序表(2)---顺序表的实现

本文详细介绍了动态顺序表的数据结构实现,采用模块化设计分为三个文件:头文件(SeqList.h)定义接口和结构体、实现文件(SeqList.c)包含具体功能函数、测试文件(test.c)进行功能验证。实现的核心功能包括初始化、扩容检查、插入删除(头尾/指定位置)、查找和销毁等操作,重点解释了动态内存管理和时间复杂度特点。通过分层设计实现代码的高内聚低耦合,测试文件展示了接口的灵活组合使用方式。文章强调理解底层逻辑的重要性,为后续数据结构学习奠定基础。

2025-07-11 09:15:00 895

原创 数据结构 顺序表(1)

动态顺序表: 在空间足够的情况下,插入和删除操作与静态顺序表类似,平均时间复杂度为 O(n)而当空间不足需要扩容时,除了移动元素的开销,还需要进行动态内存分配(如用 realloc ),- 静态顺序表:如果预先分配的空间过大,会造成内存浪费;- 静态顺序表:插入和删除操作时,如果不涉及数组越界,时间复杂度主要是移动元素的开销,平。综上所述,通过静态表和动态表的对比区别,我们可以得出动态表更加全面,在写代码的过程中也。

2025-07-10 23:08:37 781

原创 数据结构 算法复杂度(2)

上篇我们已经讲了算法复杂度中的时间复杂度,今天来讲解空间复杂度。

2025-07-10 09:00:00 762

原创 数据结构 算法复杂度(1)

本文介绍了数据结构与算法的基本概念及其关系。数据结构是数据的组织方式(如数组、链表),算法是解决问题的计算步骤,二者关系如同厨具与烹饪方法。复杂度分析衡量算法效率,包括时间复杂度(执行速度)和空间复杂度(内存占用),通过大O表示法描述其增长趋势。文章通过多个代码实例(如循环、递归、排序等)演示了如何计算时间复杂度,并强调实际应用中通常关注最坏情况下的性能表现。理解这些基础概念对设计高效程序至关重要。 (字数:149)

2025-07-08 13:14:58 960

原创 C语言编程习题Day1

empty = empty / 2 + empty % 2 → empty = 5/2 + 5%2 = 2 + 1 = 3 (换完剩 2 个空瓶,加之前没。empty = 3/2 + 3%2 = 1 + 1 = 2 (换完剩 1 个空瓶,加之前没用到的 1 个,共 2 个空瓶)- ... 以此类推,直到 i=6 :星号数 = 2*6+1=13 → 打印 *************- ... 以此类推,直到 i=5 :星号数 = (7-1-5)*2-1=1 → 打印 *

2025-06-08 17:53:42 1022

原创 C语言 预处理详解(下)

许多C的编译器提供了一种能力,允许在命令行中定义符号。用于启动编译过程。例如: 当我们根据同一个源文件要编译出一个程序的不同版本的时候,这个特性有点用处。(假定某个程序中声明了一个某个长度的数组,如果机器内存有限,我们需要一个很小的数组,但是另外一个机器内存大些,我们需要一个数组能够大些。for(i = 0;//如果现存的一个名词需要被重新定义,那么它的旧名字首先要被移除。

2025-06-01 09:30:00 1125

原创 C语言 预处理详解

C语言设置了一些预定义符号,可以直接使用,预定义符号也是在预处理期间处理的// 进行编译的源文件__FILE__// 文件当前的行号__LINE__// 文件被编译的日期__DATE__// 文件被编译的时间__TIME__// 如果编译器遵循ANSI C,其值为1,否则未定义__STDC__// 为register这个关键字,创建一个简短的名字// 用更形象的符号来替换一种实现;// 在写case语句的时候自动把break写上case。

2025-05-31 09:30:00 6884

原创 C语言 编译和链接

我们在test.c文件中每一次使用Add函数和g_val的时候必须确切的知道Add和g_val的地址,但是由。于每个文件是单独编译的,在编译器编译test.c的时候并不知道Add函数和g_val变量的地址,所以。符号Add在其他模块中查找Add函数的地址,然后将test.c中所有引用到Add的指令重新修正,让他。们的目标地址为真正的Add函数的地址,对于全局变量g_val也是类似的方法来修正地址。将源代码程序被输入扫描器,扫描器的任务就是简单的进行词法分析,把代码中的字符分割成一系。这些语法树是以表达式。

2025-05-30 09:00:00 1365

原创 C语言 文件操作(2)

上面说的适用于所有输入流一般指适用于标准输入流和其他输入流(如文件输入流);所有输出流一般指适用于标准输出流和其他输出流(如文件输出流)。

2025-05-28 22:48:43 1117

原创 C语言 文件操作(1)

磁盘(硬盘)上的文件是文件。程序文件、数据文件(从文件功能的角度来分类的)。

2025-05-27 08:45:00 970

原创 Python 数据类型方法(1)

end (可选):指定查找的结束位置索引(不包含该位置),默认为字符串的长度,即查找到字。- end (可选):指定查找的结束位置索引(不包含该位置),默认值为字符串的长度,即查找到。- end (可选):结束位置索引(不包含该位置),默认为字符串的长度,即统计到字符串末尾。- start (可选):指定开始查找的起始位置索引,默认值为0,即从字符串开头开始查找。- start (可选):指定开始查找的起始位置索引,默认为0,即从字符串开头开始查找。,用来分隔 ite 中的每个元素。

2025-05-25 13:14:00 990

原创 C语言 动态内存管理(4)

执行 printf(str);同样是访问已释放的无效内存区域,也会导致未定义行为。关键结论:

2025-05-24 16:55:03 986

原创 C语言 动态内存管理(3)

C/C++程序内存分配的几个区域:1. 栈区(stack):在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。栈区主要存放运行函数而分配的局部变量、函数参数、返回数据、返回地址等。2. 堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS(操作系统)回收。分配方式类似于链表。3. 数据段(静态区):(static)存放全局变量、静态数据。

2025-05-23 10:00:00 1101

原创 C语言 动态内存管理(2)

我们在文章一中讲了动态内存管理以及malloc函数和free函数,了解了堆内存的开辟及应用管理,接下来在本篇文章中我们将讲解calloc函数和realloc函数,进一步了解动态内存管理的内容!

2025-05-22 09:00:00 1184

空空如也

空空如也

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

TA关注的人

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