自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【C++】掌握string类操作:高效处理字符串

摘要:本文介绍了C++中string类的常用修改操作和函数。主要包括:1. push_back、append、operator+=等尾部追加操作;2. c_str()返回C风格字符串;3. find()和rfind()查找子串位置;4. substr()截取子串;5. string::npos表示查找失败的特殊值。文章还比较了VS和g++下string的不同实现结构:VS采用小字符串优化(16字节内嵌存储),g++使用写时拷贝技术。此外,还介绍了非成员函数如operator+、getline()等的用法,强

2025-08-30 12:31:18 828

原创 【C++ 】string类操作全解析

C++的string类比C语言字符串更安全高效,采用面向对象设计,自动管理内存空间。常用操作包括:构造空字符串、从C字符串构造、拷贝构造;size()/length()获取长度,capacity()查看容量,empty()检测空串;reserve()预留空间,resize()调整字符数;可通过[]、at()访问字符,用迭代器或范围for循环遍历。string类避免了C字符串越界风险,简化了字符串操作,是C++开发的重要工具。

2025-08-30 12:23:12 496

原创 【C++ 】STL六大组件与容器全解析

STL(标准模板库)是C++标准库的核心组件,提供数据结构和算法框架。其发展经历了HP原始版、P.J.版、RW版和SGI版等版本,其中SGI版因可读性好被广泛采用。STL包含六大组件,其中容器(如vector/list)直接管理数据,支持迭代器;而容器适配器(如stack/queue)则基于底层容器封装,只提供特定接口(如LIFO栈操作)。两者主要区别在于接口开放程度和功能定位,容器更灵活,适配器则专注于特定数据结构场景。学习STL需循序渐进,从使用到底层原理再到扩展应用。

2025-08-30 12:03:14 334

原创 【C++】掌握类模板:多参数实战技巧

类模板是创建通用类的模具,通过template<class T1,...,class Tn>定义,允许使用多个类型参数。实例化时需显式指定具体类型(如Vector<int>),每个参数组合生成独立类。类模板内部可使用模板参数定义成员变量和函数,类外定义成员函数需加模板参数列表。与函数模板不同,类模板必须通过<>指定类型才能实例化,类模板名本身不是有效类型。示例展示了动态顺序表Vector的实现,包含构造函数、析构函数和操作接口,演示了模板参数T在类内外的使用方式。

2025-08-29 21:15:21 257

原创 【C++】泛型编程:万能交换函数实现

本文介绍了C++中泛型编程的实现方式——函数模板。通过模板可以创建通用的交换函数,避免为不同类型编写重复代码。函数模板使用template<typename T>语法定义,编译器会根据调用时的实参类型自动实例化对应的函数版本。文章详细讲解了模板的隐式/显式实例化机制,以及模板函数与普通函数的匹配优先级规则:优先匹配普通函数,但当模板能产生更匹配的版本时会选择模板。同时指出模板不支持自动类型转换,而普通函数可以。这种泛型编程方式提高了代码复用率和可维护性。

2025-08-29 21:13:34 365

原创 揭秘C++中new和delete的底层原理

文章摘要:本文深入解析了C++中new/delete的实现原理,对比了与malloc/free的区别。对于内置类型,new/delete与malloc/free功能类似,但new会抛出异常;对于自定义类型,new会调用构造函数,delete会调用析构函数。文章还介绍了定位new表达式,用于在已分配内存上构造对象。最后讨论了内存泄漏问题,包括定义、危害、分类(堆内存泄漏和系统资源泄漏)、检测方法(如_CrtDumpMemoryLeaks)以及预防措施(如智能指针和RAII思想)。

2025-08-28 17:59:33 690

原创 【C++】内存管理与new/delete深度解析

C/C++内存管理概述:程序内存分为栈(向下增长,存放局部变量)、堆(向上增长,动态分配)、数据段(全局/静态数据)、代码段(可执行代码)和内存映射段(进程通信)。C++在C的malloc/free基础上引入new/delete运算符,new会调用构造函数,delete会调用析构函数,特别对自定义类型更安全高效。底层实现上,operator new通过malloc分配内存,失败时抛出异常;operator delete通过free释放内存。new/delete与malloc/free的关键区别在于会调用构造

2025-08-28 17:55:19 419

原创 【C++】静态成员与友元详解

摘要:本文介绍了C++中的三个重要特性:静态成员、友元和内部类。静态成员包括静态变量和函数,它们属于类而非对象,需在类外初始化,且静态函数不能访问非静态成员。友元突破了封装限制,允许外部函数或类访问私有成员,但会提高耦合度。内部类是定义在另一个类内部的独立类,可访问外部类的静态成员,且不影响外部类大小。文中通过日期类、时间类等示例演示了这些特性的具体应用场景和实现方式。

2025-08-27 22:23:27 554

原创 【C++】深入解析构造函数初始化

本文介绍了C++构造函数的初始化方式及相关概念。首先指出构造函数体内赋值并非初始化,而是赋初值,真正的初始化应通过初始化列表实现。初始化列表语法以冒号开头,成员变量只能初始化一次,特别适用于引用、const成员和自定义类型成员。文章强调初始化顺序由成员声明顺序决定而非初始化列表顺序,并通过示例演示了可能的陷阱。最后讲解了explicit关键字的作用:禁止单参构造函数的隐式类型转换,避免可读性问题。文中通过Date类的多个示例,展示了不同初始化方式和explicit关键字的应用场景及其效果。

2025-08-27 22:20:27 989

原创 【C++】日期类实现与设计技巧详解

该C++ Date类实现了日期的基本操作,包括日期验证、比较、增减天数等功能。核心设计包括:1) 使用静态数组存储每月天数,处理闰年判断;2) 构造函数进行日期合法性校验;3) 运算符重载采用复用原则,仅实现<和==,其他通过逻辑组合实现;4) 严格区分前置/后置自增自减运算符;5) 日期增减天数处理跨月/跨年逻辑,支持负数天数;6) 日期差计算采用循环计数方式。代码体现了C++面向对象设计的经典技巧,如静态变量优化、运算符重载规范、容错处理等,保证了类的健壮性和易用性。

2025-08-26 09:12:38 703

原创 【C++ 】const成员函数完全解析

本文介绍了C++中const成员函数的相关概念和使用要点。const成员函数通过修饰this指针来限制函数对类成员的修改,确保const对象的只读性。文章通过Date类示例展示const和非const成员函数的区别,并解答了四种调用场景的权限问题:const对象不能调用非const成员函数,而非const对象可以调用const成员函数;const函数内不能调用非const函数,但非const函数可以调用const函数。此外还提到取地址操作符重载通常使用编译器默认生成即可,除非有特殊需求。最后建议只要成员函数

2025-08-26 08:50:56 291

原创 【C++】拷贝构造与赋值重载详解

本文介绍了C++中拷贝构造函数和赋值运算符重载的核心概念。拷贝构造函数用于通过已有对象创建新对象,必须使用引用传参以避免无限递归。赋值运算符重载需定义为类成员函数,支持连续赋值并检查自赋值情况。默认的拷贝构造和赋值操作是浅拷贝,对于包含动态内存的类需要自定义深拷贝实现。通过日期类和栈类的示例,说明了这些特性的实际应用及注意事项。

2025-08-25 09:19:25 790

原创 【C++】默认成员函数--构造、析构全解析

本文介绍了C++类中6个默认成员函数,重点讲解了构造函数和析构函数。构造函数在对象创建时自动调用用于初始化,具有与类同名、无返回值、可重载等特性;若未显式定义,编译器会生成默认构造函数。析构函数在对象销毁时自动调用用于资源清理,具有~类名形式、无参数、不可重载等特性;未定义时编译器也会生成默认析构函数。特别指出,编译器生成的默认构造函数和析构函数会对自定义类型成员调用其相应的构造函数和析构函数,而对于内置类型则不做处理。当类涉及资源申请时,必须显式定义析构函数以避免资源泄漏。

2025-08-25 09:01:36 1305

原创 【C++】中this指针的奥秘

本文介绍了C++中的this指针机制。当类成员函数被调用时,编译器会自动添加一个隐藏的this指针参数,指向当前调用对象。this指针具有以下特性:类型为类名*const,只能在成员函数内部使用,本质是函数形参,存储在栈上,通过寄存器传递。文章通过两个面试题说明:当成员函数不访问成员变量时(如Print()),即使this指针为空也能正常运行;但若访问成员变量(如PrintA()),空指针会导致崩溃。

2025-08-24 09:54:16 275

原创 【C++】类与对象的奥秘解析

本文介绍了C++面向对象编程中类的核心概念。首先对比了C语言面向过程与C++面向对象的差异,指出C++通过对象交互实现功能。接着详细讲解了类的定义方式、成员变量和函数的声明规范,强调了命名规范的重要性。文章还深入分析了访问限定符(public/protected/private)的作用和区别,比较了struct与class的异同。在内存管理方面,解释了类实例化的本质是分配实际存储空间的过程,并通过示例说明了类大小计算规则和空类的特殊处理(占用1字节)。最后指出成员函数存放在公共代码段而非对象中,有效节省了内

2025-08-24 09:46:02 857

原创 【C++11】范围for循环与nullptr详解

C++11引入了基于范围的for循环和nullptr关键字来改进代码可读性和安全性。范围for循环简化了数组和容器的遍历,其语法为for(auto& e : array),但要求迭代范围必须确定且对象支持++和==操作。nullptr则解决了C++98中NULL宏的二义性问题,专门用于表示空指针,避免函数重载时的歧义。建议在C++11及以上版本中使用nullptr替代NULL或0来表示空指针,以增强代码健壮性。这些新特性使C++代码更简洁、更安全。

2025-08-23 08:52:57 903

原创 【C++】 auto关键字:类型推导新利器

在早期 C/C++中 auto 的含义是:使用。

2025-08-23 08:45:33 1013

原创 【C++]揭秘内联函数:C++性能优化的秘密武器

内联函数会在调用它的地方展开,导致这个函数没有地址,而其他文件如果要调用这个函数就需要链接它。2.在 debug 模式下,需要对编译器进行设置,否则不会展开(因为 debug 模式下,编译器默认不会对代码进行优化,以下给出 vs2013 的设置方式)因为 inline 被展开,就没有函数地址了,链接就会找不到。如果在上述函数前增加 inline 关键字将其改成内联函数,在编译期间编译器会用函数体替换函数的调用。,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。的函数叫做内联函数,

2025-08-22 14:24:44 332

原创 【C++】引用机制深度解析

2. 一个变量可以有多个引用3. 引用一旦引用一个实体,再不能引用其他实体。

2025-08-22 14:20:28 1055

原创 【C++】函数重载原理与实战

自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重载了。比如:以前有一个笑话,中国有两个体育项目大家根本不用看,也不用担心。一个是乒乓球,一个是男足。前者是“谁也赢不了!”,后者是“谁也赢不了!是函数的一种特殊情况,C++允许在声明几个功能类似,这些同名函数的,常用来处理实现功能类似数据类型不同的问题。调用重载函数可以自动识别类型的顺序不同不是形参的顺序不同,是类型的顺序不同,我们要理解 Cpp 对函数名字的修饰原理下图函数不构成重载。

2025-08-21 08:53:37 935

原创 【C++】命名空间与缺省参数全解析

C++通过命名空间(namespace)解决命名冲突问题,相比C语言能更灵活地管理标识符。其输入输出使用cout/cin流对象,支持自动类型识别。C++还引入缺省参数功能,允许函数参数指定默认值,分为全缺省和半缺省两种形式。这些特性使C++在代码组织和函数调用方面比C语言更具优势,但需注意命名空间展开可能引发的命名污染问题,以及缺省参数在声明和定义中的一致性要求。

2025-08-21 08:39:20 656

原创 【数据结构】1亿数据排序:内存不足的解决之道

文件中有1亿个数据需要排序,假设内存最多存1000W个数据,怎么办?

2025-08-20 23:47:32 1091

原创 【数据结构】递归与非递归:归并排序全解析

归并排序的递归实现,核心思想是 “分治 + 合并”—— 将数组不断分割为更小的子数组,待子数组有序后,再将它们合并为更大的有序数组。归并排序核心步骤:归并排序的单趟思想就是合并两个有序数组;把数组拆成两半 → 递归拆到最小(单个元素)→ 逐层合并成有序数组。

2025-08-20 23:38:37 550

原创 【数据结构】快速排序算法精髓解析

下面我们先理解快速排序排一趟的过程:如果选择最右边的值让右边的 end 先走选择最右边的值作为 key 需要 begin 先走,不然排序会出问题找大是找一个比基准值 key 大的数,第一个数是 6 比 5 大,end 找到比基准值小的数 4 时,将 4 和 6 交换到达中间位置时将中间数据和 key 交换一趟我们就可以把一个数组分成三个部分比 key 小的子数组,key,比 key 大的子数组。

2025-08-20 23:33:30 1050

原创 【数据结构】直接选择排序

在剩余的 array[i]--array[n-2](array[i+1]--array[n-1])集合中,重复上述步骤,直到集合剩余 1 个元素。每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的。若它不是这组元素中的最后一个(第一个)元素,则将它与这组元素中的最后一个(第一个)元素交换。在元素集合 array[i]--array[n-1]中选择关键码最大(小)的数据元素。2.遍历数组中的元素,找出当前区间最小和最大数据的下标;时间复杂度:O(N^2)

2025-08-20 23:21:12 167

原创 【数据结构】希尔排序:高效分组的插入排序优化

当 gap > 1 时都是预排序,目的是让数组更接近于有序。当 gap == 1 时,数组已经接近有序的了,这样就。gap 越大,前面大的数据可以越快到后面,后面小的数可以更快到前面。希尔排序的时间复杂度不好计算,因为 gap 的取值方法很多,导致很难去计算,因此在好些树中给出的。gap 越小越接近有序,如果 gap==1 其实相当于直接插入排序就有序了;这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。希尔排序是对直接插入排序的优化。希尔排序的时间复杂度都不固定。

2025-08-20 23:18:57 112

原创 【数据结构】揭秘直接插入排序:玩扑克也能学算法

简单来说:就是将待插入的数据与序列中的数据一一对比,然后插入序列合适的位置;实际中我们玩扑克牌时,就用了插入排序的思想。我们可以创建一个数组测试一下。

2025-08-20 23:16:55 203

原创 【数据结构】排序算法全解析:概念与接口

所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且 r[i]在 r[j]之前,而在排序后的序列中,r[i]仍在 r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。:数据元素全部放在内存中的排序。:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。

2025-08-20 23:05:46 411

原创 【数据结构】使用队列解决二叉树问题

本文介绍了二叉树的层序遍历和完全二叉树的判断方法。层序遍历通过队列实现:根节点入队后,循环取出队首节点并访问,同时将其左右子节点入队,直到队列为空。对于完全二叉树的判断,同样使用队列进行层序遍历,在遇到第一个空节点后检查队列剩余节点是否全为空,若存在非空节点则不是完全二叉树。文章以二叉树A(BC(DEF))为例,详细演示了层序遍历ABCDEF的执行流程,并给出了两种算法的C语言实现代码。

2025-08-19 23:32:20 374

原创 【数据结构】二叉树-堆(深入学习 )

本文介绍了二叉树的基本概念和操作实现。主要内容包括:1.二叉树链式结构的基本实现方式,通过手动创建简单二叉树进行学习;2.二叉树的三种遍历方式(前序、中序、后序)及其递归实现;3.层序遍历的概念;4.计算二叉树节点数的三种方法比较;5.求叶子节点数、第K层节点数的实现;6.查找特定值节点和销毁二叉树的递归实现。文章强调二叉树操作多采用递归实现,并提供了详细的代码示例,适合初学者理解二叉树的基本操作原理。

2025-08-19 23:25:13 821

原创 【数据结构】用堆解决TOPK问题

该算法使用大堆结构高效找出数组中最小的k个数。关键实现包括:1)处理边界条件(k<=0或k>=数组长度);2)构建k大小的大堆;3)遍历剩余数组元素,替换堆顶元素并调整堆结构。通过从最后一个非叶子节点开始构建堆,确保时间复杂度为O(nlogk)。算法内存使用合理,直接返回堆空间作为结果,避免额外拷贝。HeapDown函数严谨实现大堆特性,包含子节点比较和边界检查,保证了代码健壮性。该方法相比全排序更高效,特别适合处理大规模数据。

2025-08-19 23:13:56 426

原创 调试技巧(vs2022 C语言)

启动调试,经常用来直接跳到下一个断点处(F5通常和F9配合使用,打了断点按F5程序可以直接运行到断点处,这样提高了调试效率)F10和F11有区别,F11可以进到Add函数内部(但是现在的编译器一般不支持调试库函数),F10不会,所以F11更加细致。创建断点和取消断点(可以在程序的任意位置设置断点,这样可以让程序在随意的位置停止执行,继而一步步执行下去)逐语句,即每次执行一条语句,但是这个快捷键可以使我们的执行逻辑进入函数的内部(这是最常用的)调试可以看函数堆栈,反汇编,寄存器等。

2025-08-18 09:15:20 646 2

原创 【数据结构】堆中插入数据,删除数据

堆插入数据我们是从尾部插入,插入数据不应该改变堆的性质(即不改变堆之前大堆或小堆的性质),比如在小堆时,如果插入的数据比插入位置的父结点小就不需要进行额外操作,但是如果插入的数据比插入位置的父结点大就需要进行相应调整,让其依然是小堆。比如上图的堆要插入的数据是13,应该如何进行调整?我们可以发现插入的数据只是对一条路上的数据有影响,我们只需要调整这一条路的数据即可。调整的方法我们使用向上调整算法1.通过插入位置坐标得到插入结点(我这里还是叫child)的父亲结点;

2025-08-18 09:11:36 477

原创 【数据结构】“令冒泡排序的我叹为观止”-堆排序

−1)(如第 1 层2^0=1个结点,第 2 层2^1=2个结点,…−2),调整次数1(因为下一层就是叶子结点),贡献2^((高中的知识,忘记了可以复习一下,用到了错位相减法)−1)的非叶子结点,最多需要向下调整到叶子结点(第。层),因此最大调整次数为 “层数差”:调整次数=,冒泡排序的时间复杂度是:N^2;=1):结点数2^0,调整次数。=2):结点数2^1,调整次数。这样就可以将一个数组排成降序。可以看出堆排序的效率更高;根结点为第 1 层,−1,贡献2^0×(−2,贡献2^1×(−1):结点数2^(

2025-08-17 08:16:43 258

原创 【数据结构】堆-“此堆非比堆”

如果有一个关键码的集合K = { k0,k1 ,k2 ,…,k(n-1) },把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足:Ki <= K(2i+1)且 Ki<= K(2i+2)(Ki>=K(2i+1)且Ki>=K2i+2) i = 0,1, 2…,则称为小堆(或大堆)。将根结点最大的堆叫做最大堆或大根堆,根结点最小的堆叫做最小堆或小根堆。堆的性质:堆中某个结点的值总是不大于或不小于其父结点的值;堆总是一棵完全二叉树。大堆:(没有规定左右孩子谁大谁小)完全二叉树。

2025-08-17 08:15:42 931

原创 【数据结构】二叉树概念及结构

摘要:二叉树是每个节点最多有两个子树的树结构,子树分左右且不可颠倒。其重要性质包括第i层最多有2^(i-1)个节点、深度为h的树最多有2^h-1个节点、叶节点数n0=度为2的节点数n2+1等。存储方式分为顺序存储(适合完全二叉树)和链式存储(分二叉链和三叉链)。完全二叉树的节点关系可通过数组下标计算父子节点位置。这些特性使二叉树成为高效的数据结构基础。

2025-08-16 14:25:36 1144

原创 【数据结构】树的概念及结构

摘要 树是一种非线性数据结构,由具有层次关系的节点集合组成,形似倒挂的树形结构。树的基本概念包括根节点、子树、节点度(子节点数量)、叶节点(度为0)、分支节点、父子关系、兄弟节点等。树的度指树中节点的最大度数,深度指节点的最大层次。树结构可以通过多种方式表示,常用的有孩子兄弟表示法。树结构在实际应用中主要用于表示层次关系,如文件系统的目录结构,而非单纯存储数据。树具有递归定义的特点,森林则是多棵互不相交树的集合。

2025-08-16 14:17:02 250

原创 【数据结构】队列

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出入队列:进行插入操作的一端称为队尾出队列:进行删除操作的一端称为队头。

2025-08-15 23:12:18 239

原创 【数据结构】搞懂何为“栈”?

栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。压栈:栈的插入操作叫做进栈/压栈/入栈,出栈:栈的删除操作叫做出栈。基于栈的相关功能实现。

2025-08-15 23:09:49 262

原创 理清C语言中内存操作的函数

C语言内存操作函数(memcpy、memmove、memset、memcmp)是处理二进制数据的核心工具。memcpy实现高效内存复制但不处理重叠,memmove则能安全处理重叠内存的复制。memset用于内存初始化(按字节填充),memcmp提供二进制数据比较功能。这些函数以字节为单位操作,适用于任意数据类型,但使用时需注意内存边界、重叠问题和数据类型特性。与字符串函数不同,它们不依赖终止符,适合处理原始内存数据。正确使用这些函数能提升程序效率和安全性。

2025-08-10 14:51:31 976

空空如也

空空如也

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

TA关注的人

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