- 博客(74)
- 资源 (1)
- 收藏
- 关注
原创 C++学习——多态
本文介绍了面向对象编程中的多态特性及其在C++中的实现方式。多态允许通过统一接口调用不同类的对象,提高代码灵活性。文章重点讲解了虚函数机制,包括虚函数声明、重写条件、协变返回类型和析构函数重写等核心概念。同时介绍了C++11新增的override和final关键字,帮助开发者更安全地实现多态。最后对比了重载、覆盖和隐藏三者的区别。多态通过虚函数实现运行时绑定,是面向对象编程的重要特性。
2025-09-29 19:27:20
541
原创 C++学习——继承
本文系统介绍了C++面向对象编程中的继承机制。主要内容包括:1. 继承的基本概念与定义方式(public/protected/private继承);2. 基类与派生类对象间的赋值转换规则(子类可赋给父类,反之需强制转换);3. 继承中的同名成员处理(隐藏规则与作用域);4. 派生类默认成员函数的实现要点;5. 友元、静态成员在继承中的特性;6. 多继承与菱形继承问题(数据冗余、二义性)及其解决方案(虚拟继承);7. 继承与组合的对比(is-a vs has-a关系)。文章强调应谨慎使用多继承,优先考虑组合而
2025-09-02 23:05:13
851
原创 C++学习——模版(详细讲解)(用着爽但头疼)
本文系统介绍了C++模板编程的核心概念与应用。主要内容包括:函数模板和类模板的定义与实例化方式,模板参数的类型推导规则,模板特化机制(全特化和偏特化),以及模板分离编译的技术难点与解决方案。文章通过交换函数、容器类等实例,详细讲解了模板的语法格式、工作原理和实际应用场景,同时分析了模板在代码复用中的优势与局限性(如代码膨胀、错误信息难定位等)。最后针对模板分离编译问题,提出了包含模式和显式实例化两种实用解决方案。
2025-08-28 23:54:27
625
原创 STL——priority_queue的使用(快速入门详细)
摘要:本文介绍了C++中优先队列(priority_queue)的基本用法,该容器位于queue头文件中,底层实现基于大根堆结构。主要说明了优先队列的特点(总保持最大元素在顶部)、常用操作(push、pop、top等)以及默认使用vector作为底层容器。通过示例代码展示了如何初始化、插入元素和遍历输出优先队列中的内容,帮助读者快速掌握这一数据结构的基本使用方法。
2025-08-26 22:37:30
298
原创 STL——queue的使用(快速入门详细)
本文介绍了队列的基本概念和使用方法。队列是FIFO(先进先出)的容器适配器,元素从一端插入,另一端提取。文章详细说明了队列的常用操作函数,包括empty()、size()、front()、back()、push()和pop()等,并提供了一个C++示例代码演示队列的基本操作流程。与栈不同,队列弹出数据是从队头开始弹出。通过代码示例可以快速掌握队列的基本使用方法。
2025-08-26 11:30:04
186
原创 STL——stack的使用(快速入门详细)
本文介绍了堆栈(stack)的基本概念和使用方法。堆栈是一种后进先出(LIFO)的容器适配器,元素只能从栈顶进行插入和删除操作。文章详细说明了stack的主要操作函数,包括empty()、size()、top()、push()和pop(),并提供了C++代码示例展示如何初始化栈、压入元素、获取栈顶元素和弹出元素。通过代码可以直观理解stack的LIFO特性及其基本操作流程。
2025-08-26 11:17:45
131
原创 STL——vector的使用(快速入门详细)
本文介绍了C++中vector容器的基本使用。vector是可变大小的序列容器,支持高效随机访问。主要内容包括:1.vector的构造方法(无参、拷贝、迭代器初始化等);2.迭代器使用(正向/反向遍历);3.空间管理(size/capacity/resize/reserve);4.元素操作(增删查改、尾插尾删、插入删除、swap/assign等)。重点注意事项:1.vector元素存储在连续内存空间;2.扩容机制会影响性能;3.使用erase时要注意迭代器失效问题,正确做法是接收erase返回值作为新的迭代
2025-08-25 23:10:49
1273
原创 STL——string的使用(快速入门详细)
本文介绍了C++中string类的基本知识和常用接口。string是表示字符串的类,底层是basic_string模板类的别名。文章重点讲解了string的构造函数、容量操作(size/length/empty/resize等)、访问遍历(operator[]/迭代器/范围for)、修改操作(append/replace/erase等)以及非成员函数(输入输出运算符/getline等)。通过示例代码演示了如何创建string对象、获取字符串长度、修改字符串内容等常见操作,并提供了URL解析等实用案例。最后指
2025-08-19 23:05:30
1102
原创 C++学习——内存管理
本文介绍了C/C++内存分布及管理方式。主要内容包括:1)内存分布的五大区域:栈(局部变量)、堆(动态分配)、全局/静态存储区、常量存储区和代码区;2)C语言使用malloc/free进行堆内存管理,而C++引入new/delete操作符,能自动调用构造/析构函数;3)operator new/delete函数作为底层实现,new在分配失败时抛异常;4)对自定义类型,new会调用构造函数,delete调用析构函数。文章详细对比了不同内存区域的特点和管理方式的差异。
2025-08-19 17:53:56
944
原创 数据结构(9)——排序
本文系统介绍了多种经典排序算法及其实现。主要内容包括:1. 基础排序算法:插入排序(O(n²))、希尔排序(O(n^(1.3-2)))、选择排序(O(n²))、冒泡排序(O(n²));2. 高效排序算法:快速排序(O(nlogn))及其多种变体、堆排序(O(nlogn))、归并排序(O(nlogn))的递归与非递归实现;3. 特殊排序:计数排序(O(n+k))等非比较排序;4. 优化策略:如三数取中法、小区间优化、边界处理等技巧。文章通过代码示例和图示详细解析了每种算法的核心思想、实现步骤和性能特点,为理解
2025-08-09 23:39:19
993
原创 C++学习——类和对象(详解版)
本文系统介绍了C++中类与对象的核心概念,主要内容包括: 面向对象与面向过程的本质区别(关注对象交互 vs 关注执行步骤) 类的定义方法(成员变量/函数、访问限定符、封装特性) 类的6个默认成员函数(构造/析构/拷贝构造等)及其使用场景 特殊成员:this指针、static成员、友元函数/类的特性与应用 运算符重载规则与常用运算符实现方法 通过具体代码示例,阐述了类的作用域、实例化、对象大小计算等关键知识点,并对比了浅拷贝与深拷贝的区别。文章还特别强调了初始化列表、explicit关键字等易错点的使用方法,
2025-07-28 03:27:42
1346
原创 C++学习——内联、C++11中的auto、for循环、nullptr
本文介绍了C++中的三个重要特性:内联函数、auto关键字和nullptr空指针。内联函数通过inline关键字实现,在编译时展开以避免函数调用开销,相比宏定义更安全且可调试。auto关键字可自动推导变量类型,常与范围for循环配合使用简化代码。nullptr作为C++11引入的空指针类型,比传统的NULL更安全明确。这些特性都能提升代码效率和可读性,但需注意内联函数可能导致代码膨胀,auto要避免滥用,指针初始化建议使用nullptr而非NULL或0。
2025-07-22 20:20:24
669
原创 数据结构(8)——二叉树(2)
本文介绍了二叉树的基本概念和遍历方法。主要内容包括:1.二叉树的结构定义和创建方法;2.四种遍历方式(前序、中序、后序、层序)的递归实现;3.计算二叉树节点数、高度和指定层节点数的方法;4.判断完全二叉树的算法;5.二叉树销毁的后序遍历实现。文章通过代码示例详细讲解了每种算法的实现思路,强调递归在二叉树操作中的重要性,并分析了时间复杂度。其中,层序遍历需借助队列,而完全二叉树的判断则利用了层序遍历的特性。
2025-07-13 12:12:19
829
原创 堆排序——纯享版完整代码
代码实现了一个堆数据结构(Heap),包含创建、销毁、插入、删除等基本操作。主要功能包括:1)使用动态数组存储堆元素;2)提供向上调整(AdjustUp)和向下调整(AdjustDown)方法维护堆性质;3)支持大根堆操作(通过比较逻辑可改为小根堆);4)实现堆排序算法(HeapSort),时间复杂度为O(nlogn)。测试案例展示了堆的基本操作和排序功能,初始化为大根堆,通过交换和调整实现升序排序。代码结构清晰,分为头文件(Heap.h)、实现文件(Heap.c)和测试文件(main.c)。
2025-06-15 15:30:38
254
1
原创 数据结构(7)—— 二叉树(1)
本文系统介绍了树结构和二叉树的原理及应用。首先阐述了树的基本概念和相关术语,包括节点度、层次、深度等属性,以及三种常见的树结构表示方法。重点讲解了二叉树的概念、性质和存储方式,详细分析了满二叉树和完全二叉树的特点。在实现层面,以堆结构为例,深入解析了顺序存储二叉树的实现机制,包括初始化、插入删除、向上/向下调整等核心操作算法。最后通过堆排序示例展示了树结构在排序算法中的实际应用。全文通过理论结合代码实现的方式,完整呈现了树形数据结构的基本原理和典型应用场景。
2025-06-04 19:21:45
1628
1
原创 数据结构(6)——队列
本文介绍队列,以及实现的代码。一、队列的概念及其结构相对于栈来说,队列跟栈就是相反的。队列只允许在一端插入数据,在另一端进行删除数据操作的特殊线性表,队列具有先进先出的特性。(First In First Out,FIFO),队列常用于实现缓冲区、任务调度等场景。入队列:进行插入操作的一端称为队尾。出队列:进行删除操作的一端称为队头。下面是一个简单的图形,方便理解:这里如果实现链表的话,使用一个单链表就可以,使用数组的话不方便。//数据类型//节点//数据}QNode;
2025-04-19 18:00:57
1136
1
原创 数据结构(5)——栈
栈是一种常见的数据结构,其主要作用是存储和管理数据。栈遵循先进后出(FILO)的原则,即最后入栈的元素最先出栈。栈通常用于临时存储数据、函数调用和表达式求值等场景。一、//动态栈int top;//下标}ST;动态栈的结构体定义就是以上,一个块内有一个数据域,然后定义一个下标,用来实现后续的操作,还有当前数组的容量,后续可以对其实现更新。数据类型用typedef来定义。这篇文章很详细地介绍了栈的概念、结构以及实现,同时提供了栈的各种操作函数的代码实现。
2025-04-02 16:44:53
1077
1
原创 ERROR: AddressSanitizer: SEGV on unknown address 0x5030020fe36c...LeetCode报错
这可能就是导致错误的原因。比如,当第一次进入内部的while循环时,sum已经足够大,这时候left的值可能是一个很大的数,导致数组访问越界,或者在sum -= nums[left++]的时候出现负数索引或者超过数组长度的索引,从而引发运行时错误,比如段错误或者访问越界异常。这里总结了一下,一般出现这一堆东西都是要么是数组越界,要么就是地址错误。这里就是left没有被正确初始化。这段代码是一个滑动窗口的题。
2025-03-31 21:09:00
509
原创 数据结构(4)——带哨兵位循环双向链表
前面我们学习了单链表的一些知识,由单链表引申出双向链表,同时带哨兵位或者不带哨兵位是两种,但大差不差,这里学习一下带哨兵位的循环双向链表。其实有很多链表的结构,组成它们的也就是循环非循环,带哨兵位不带哨兵位,双向还是单向。一、带哨兵的循环双向链表是什么无哨兵单向非循环链表:结构简单,也就是我们常说的单链表,一般不会用来单独存数据,实际中更多是作为其它数据的子结构,如哈希桶,图的邻接表等等。而带哨兵双向循环链表。
2025-03-29 15:36:41
1049
原创 Linux学习——Linux基本命令(1)
在这里我使用的是腾讯云的云服务器,系统是CentOS 7.6 ,基于云服务器学习还是很方便的,现在也有许多免费试用的活动,可以进行学习。一、Linux操作的特点特点就是纯命令行,但是Linux也有图形化界面,很多都是有图形化界面。但是大多数在以后的工作中都是通过远程连接的形式来实现,所以一定需要掌握Linux的命令行操作。Windos也是命令行,但是大多数都是图形化界面,其实以前都是命令行,后期才有的图形化界面。现在的许多产品依旧是支持命令行,支持Linux指令。无论是图形化还是指令,本质都是一样的。
2025-03-22 08:50:11
899
原创 LeetCodeBug-member access within null pointer of type ‘struct ListNode‘
可能是因为当我们调用节点的next时,它并不知道该节点是否为空,所以我们要先判断该节点是否为空后在对该节点的next进行操作。记录一下这个Bug的解决办法,我是在这里出现bug的。的问题,经过网上的搜索和一堆见解,我自己总结了一下。应该属于逻辑的问题,当我们调换后发现可以通过了。这里利用快慢指针解决问题,但是出现了。
2025-02-18 12:29:32
331
原创 数据结构(3)——单链表
我们之前学过了顺序表,认识到本身就是一段连续的储存地址构成的空间,可以不断通过动态分配内存构成空间,而链表在空间上与它不同。一、链表的概念和结构为什么要写一个这样的函数,因为我们后续的实现,包括插入,删除,查找什么的都可能会需要这一段代码,为了防止复用,所以就直接自己封装一个函数代码,以后调用就方便多了。//定义一个首节点return;//对首节点初始化。
2025-02-17 12:29:09
911
原创 C++学习——缺省参数、重载函数、引用
缺省参数的含义很好理解,重载函数是一个很有意思的用法,对比C语言有了很大的改变。我们之前在C语言中学过指针,一个*对应着一个&,分别是解引用和取地址,那么在C++里也有一个类似的但是它只有一个&,通过这种用法这里就不是取地址的意思了,而是引用的意思,而且比较方便容易使用。int& b;return 0;这里要是不初始化的话就会报错。1、基本任何场景都可以用引用传参。引用作为参数就是为了提升效率,针对两种情况最适合用引用来作为参数,第一个是大对象,第二个是深度拷贝对象。深度拷贝是指在拷贝对象时,不仅要复制对象
2025-02-06 22:07:45
955
原创 数据结构(2)——线性表与顺序表实现
今天对顺序表进行学习,可以把它了解成一个连续的表,类似数组。一、线性表线性表(linear list)是N个具有相同特性的数据元素的有限数列。线性表是一种在实际中广泛使用的数据结构,常见的线性表有:顺序表、链表、队列、字符串等等。顺序表这里实现增删改查,分别实现的功能有初始化,头删,头插,尾删,尾插,修改,查元素。我们开始实现:
2025-02-03 21:28:58
1079
原创 数据结构(1)——算法时间复杂度与空间复杂度
数据结构”是计算机程序设计的重要理论技术基础,它不仅是计算机的核心课程,而且已成为其它理工专业的热门选修课。——《数据结构C语言版》严蔚敏一、算法1.1算法是什么?首先,我们总能听见算法算法的,到最后一问你算法是什么?你支支吾吾的回答说不就是一些计算的方式吗?难不成还有其它解释方法。对此,在严蔚敏算法(algorithm)是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或者多个操作。
2025-02-01 18:04:56
1309
2
原创 C++学习——认识和与C的区别
开启新的篇章,这里进行对C++的学习,本篇文章知识简单介绍一下C++,一点知识,以及和C的区别。我们之前学过C语言,知道C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂一些的问题,需要高度的抽象和建模的时候,C语言不合适。所以C++就出现了。C++(c plus plus)是一种计算机高级程序设计语言,由C语言扩展升级而产生,最早于1979年由本贾尼·斯特劳斯特卢普在AT&T贝尔工作室研发。C++既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型。
2025-01-27 21:31:46
1589
原创 C语言教程——文件处理(2)
昨天最顺序读写函数了解了四个,今天接着学习。一、顺序读写函数(续)提示:这里对文章进行总结:例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。
2025-01-25 20:24:04
1254
原创 C语言教程——文件处理(1)
我们知道电脑上有许许多多的文件,但为什么数据要用文件来储存呢?为什么要使用文件呢?且待我细细道来。一、为什么使用文件我们知道,我们写的程序什么的数据什么的都存在文件中,倘若没有存在文件中,那么它们就存在了电脑的内存中,而且如果程序退出的话,内存就会进行回收,我们的数据就也回收了,也就丢失了,等到程序再次运行,是看不见上次程序的数据的,如果将数据进行持久化的保存,我们就可以使用文件。磁盘(硬盘)上的文件是文件。文件是计算机中的一种数据存储形式,用来存储和组织数据的集合。
2025-01-23 20:43:32
936
原创 C语言教程——动态内存管理(2)
我们之前学了动态内存管理分配函数,也是熟悉了动态内存分配函数,基于动态内存分配我把之前的通讯录做了修改,上传到了gitee上,这篇文章接着学习动态内存管理。一、柔性数组1.1柔性数组的概念柔性数组是一种特殊的数组,它的大小在运行时才确定,可以根据需求动态调整数组的大小。柔性数组(flexible array)这个概念,但是它是确实存在的。C99中,结构中的最后一个元素允许是未知大小的数组,这就叫做柔性数组的成员。char b;char arr[];
2025-01-22 21:10:34
665
原创 C语言教程——动态内存管理
我们前面听过什么动态内存管理,但是为什么要有动态内存管理呢?假设我们申请一个整形空间,它只能申请4个字节,或者申请一块连续的数组空间,一旦申请好了,就不可以修改了,所以有局限性,这时候就可以通过动态内存管理,当我们用的空间不够的时候可以变长,多了的时候可以变小。主要介绍了动态内存分配的函数的使用以及注意事项,记住有申请就一定要释放。
2025-01-20 21:15:42
819
1
原创 C语言教程——自定义函数类型(2)
我们前面学完了结构体,特殊结构体,以及对结构体的内存的计算方法,接着再进行学习。一、位段位段(bitfield)是一种数据结构,用于将多个相关的位字段(bitfield)打包在一个或多个字节中。在C语言中,可以使用位段来声明位字段。位段的声明方式与结构体类似,但是有两个不同:1.位段的成员必须是int、unsignedint、或signedint。(这里补充一下,经过测试char也基本没有什么问题)2.位段的成员名后面有一个冒号和一个数字(基本都是同类型的放在一个位段类型中)structA{
2025-01-19 19:04:57
1057
原创 基于C语言的通讯录实现
学完结构体后,我们可以通过学过的知识自己来制作一个通讯录。我们在学校中难免会接触到什么什么大作业,什么什么系统,这些都大同小异,这里带着大家进行通讯录的实现。一、要实现的功能1.顾名思义,通讯录中要有人的信息,包括:姓名,年龄,性别,地址,电话2.通讯录中可以存放的人很多(这里按照可以放100个来实现)4.增加联系人5.删除指定联系人6.查找指定联系人的信息7.修改指定联系人的信息8.显示所有联系人的信息等等等还可以对名字或者年龄进行排序,后续自己想要加什么功能可以自己加。
2025-01-18 22:09:27
1100
原创 C语言教程——自定义函数类型(1)
我们前一篇学完字符串类的函数后,这篇开始进行自定义类型的学习。自定义类型主要进行了解和学习的有结构体、枚举、联合。有了结构体类型,那么定义变量就十分简单了。intx;chary[20];}s1;//全局变量//全局变量intmain()//局部变量return0;这里s1和s2就是全局变量,s3是局部变量。通过结构体类型就可以创建变量。我们如何初始化呢?intx;chary[20];
2025-01-17 20:46:52
1140
原创 C语言教程——字符串和内存函数(2)
上一篇文章介绍了几种string.h里函数的使用和注意事项,包括它们的模拟函数的编写,用自己的喜欢的方法来编写,正常情况下用库函数里的直接调用就可以,我们今天接着上一篇进行学习,接着讲解函数,之后再学习内存函数和结构体。这里介绍了一些可以对其它类型操作的函数,但也是string.h库函数里的,通过这些函数可以达到意想不到的效果。
2025-01-16 17:49:59
676
原创 C语言教程——字符串和内存函数(1)
本篇文章介绍一系列的用的比较频繁的字符函数和字符串函数内存函数。一、字符串函数介绍这三个函数长度是不受限制的,一直到‘ \0 ’所以会出现不安全的。所以出现了长度受限的函数。strncpystrncatstrncmp各自出现了一个参数,也就是多了一个限定条件。这篇讲了一些函数的用法和注意事项,下一篇接着进行学习。
2025-01-15 14:57:09
674
原创 C语言教程——指针进阶(2)
我们接着上一篇的函数指针往下学习。一、函数指针数组1.1函数指针数组写法//字符指针数组//整形指针数组那么我们就可以想一想函数指针数组是否可以呢?第一行 是一个函数指针,我们将my_strlen这个函数的地址赋予给它,当我们想要把前面的函数指针改成函数指针就可以在里面加上数组元素个数,其实就是在这个函数指针后面加上一个方括号再确定元素个数就可以了。我们去掉数组名和元素,剩下的就是一个函数指针,所以就是这个数组里面存放的就是这个函数的地址。
2025-01-10 17:01:53
895
原创 C语言教程——指针进阶(1)
我们在之前知道指针就是一个变量,用来存放地址,地址唯一标识一块内存空间,指针的大小是固定的,32位平台是4个字节,64位是8个字节,指针还是有类型的,指针的类型决定了指针的+ - 整数的步长,指针解引用操作的时候的权限。指针还是有运算的,指针加减整数,指针减去指针,指针的关系运算,忘了的可以去之前的文章复习一下。C语言教程——指针初阶,接下来学习字符指针,指针数组,&数组名VS数组名,数组指针的使用,数组参数、指针参数,一级指针传参,二级指针传参,函数指针
2025-01-09 21:52:15
635
原创 C语言教程——数据在内存中的存储
本篇文章开始进行对之前学过的知识进行深入的了解和学习,在之前的基础上补充并且加深记忆,通过代码以及讲解弄懂。一、数据类型的介绍之前的文章也了解过基本的数据类型。已经学过的有以下基本的内置类型:char //字符数据类型short //短整型int //整形long //长整型long long //更长整形。
2025-01-08 17:44:47
1089
原创 如何写出写出一手优秀的代码
优秀的代码不仅代表你的实力,同时也代表着你的书写风格的好坏。通过这个就可以判断你写的东西是否真正的符合他人的需要和团队的默契的配合。1、代码运行正常,实现基本的运行,能够跑起来2、Bug很少3、效率比较高4、可维护性高5、注释清晰6、文档齐全。
2025-01-01 12:45:35
262
原创 C语言教程——调试程序基本操作技巧
调试对于程序员来说是非常重要的,如果一个程序员只会写bug,那么就就没有人来修bug了。我们写出bug的时候,可以通过自己调试从而实现修改。我们知道以前的计算机非常的大,对计算机出现问题的时候唯一的解决办法就是进入计算机进行检查。bug原意本来为昆虫的意思,1947年9月9日,葛丽丝·霍普(Grace Hopper)发现了第一个电脑上的bug。当在Mark II计算机上工作时,整个团队都搞不清楚为什么电脑不能正常运作了。经过大家的深度挖掘,发现原来是一只飞蛾意外飞入了一台电脑内部而引起的故障(如图所示)。
2024-11-22 19:35:46
1092
1
空空如也
计算机系关于大一给一些有价值性的建议(语言-c .python)
2023-11-11
TA创建的收藏夹 TA关注的收藏夹
TA关注的人