- 博客(40)
- 收藏
- 关注
原创 【C++】多态
多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。那么在继承中要构成多态还有两个概念必须通过基类的指针或者引用调用虚函数。被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。
2024-05-05 21:56:48
1110
1
原创 【C++】继承
继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。public:protected:// 姓名// 年龄// 继承后父类的Person的成员(成员函数+成员变量)都会变成子类的一部分。// 这里体现出了Student和Teacher复用了Person的成员。
2024-05-05 21:56:14
941
原创 【算法】滑动窗口
同向指针算法是一种使用两个指针,它们同时向同一个方向移动,以解决问题的算法技巧。这两个指针可以指向数组或字符串中的不同位置,根据问题的要求,它们可以以不同的速度移动。期间会产生一段区间,因此我们可以比喻成一个窗口,而我们可以在这个窗口内对数据进行一些我们想要的处理,由于这个区间一般都会向后移动,所以我们也可以称之为滑动窗口。例如,在数组中查找目标元素时,可以使用一个指针从数组的起始位置开始遍历,另一个指针从数组的末尾开始遍历,两个指针同时向数组的中间移动。
2024-05-03 22:46:27
864
原创 【C++】模拟实现string
模拟实现不是为了写得和库里面一样好。而是为了更好的了解底层,从而能够更熟练的使用这些类,同时也能学习大佬们的代码风格。在学习这章之前,需要对类与对象有一定的知识基础,如果对类与对象有些生疏的话,可以看看这篇文章:《类与对象string 类是 C++标准库中的一个重要类,用于表示字符串。动态存储:可以自动管理内存,根据字符串的实际长度动态分配和释放内存。丰富的操作:提供了很多方便的操作方法,如字符串连接、查找、比较、提取子串等。高效性:在性能上表现较好,适用于各种字符串处理场景。
2024-05-03 22:45:26
1057
原创 【C++】STL使用详解
C++ 的标准模板库(Standard Template Library,简称 STL)是一个非常强大和实用的库,它提供了许多常用的数据结构和算法,使得 C++ 编程更加高效和方便。容器(Containers):STL 提供了一系列容器,用于存储和管理不同类型的数据。常见的容器包括向量(vector)、列表(list)、队列(queue)、栈(stack)、集合(set)、映射(map)等。每个容器都有其特定的特性和适用场景,可以根据数据的访问方式、插入和删除效率等需求选择合适的容器。
2024-05-02 11:02:38
554
原创 【C++】适配器模式
C++中的适配器是一种设计模式用于将一个类或对象的接口转换为另一个接口,以便不同的类或对象可以相互协作。适配器模式可以分为类适配器和对象适配器两种形式。类适配器通过继承源类并实现目标接口来实现适配。在类适配器中,适配器类同时继承自源类和目标接口,并重新实现目标接口的方法,以将源类的方法转换为目标接口的方法。对象适配器则通过在适配器类中包装一个源对象来实现适配。在对象适配器中,适配器类持有一个源对象的引用,并实现目标接口的方法,在方法内部调用源对象的相应方法来完成适配。
2024-05-02 11:01:35
953
1
原创 【C++】键值对pair的使用和模拟实现
在 C++ 中, pair 是一个标准库模板,它将两个不同类型的值组合成一个对。pair 通常用于将相关的两个值(例如键值对、坐标、元素和重量等)封装在一起,以便于处理和传递。pair该类将一对不同类型的值(T1和T2)耦合在一起。单个值可以通过它的公共成员第一个和第二个来访问。
2024-03-24 14:40:49
573
原创 【C++】模板与泛型编程
class 类模板名// 类内成员定义// 动态顺序表// 注意:Vector不是具体的类,是编译器根据被实例化的类型生成具体类的模具public:, _size(0){}// 使用析构函数演示:在类中声明,在类外定义。~Vector();// 注意:类模板中函数放在类外进行定义时,需要加模板参数列表。
2024-03-24 14:40:10
917
原创 【C++】STL简介
是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。其中迭代器是一个很重要的组成部分
2024-03-19 18:53:06
264
原创 【算法】双指针的应用
常见的双指针有两种形式,⼀种是对撞指针,⼀种是左右指针。⼀般⽤于顺序结构中,也称左右指针。对撞指针从两端向中间移动。⼀个指针从最左端开始,另⼀个从最右端开始,然后逐渐往中间逼近。对撞指针的终⽌条件⼀般是两个指针相遇或者错开(也可能在循环内部找到结果直接跳出循环),也就是:(两个指针指向同一个位置)(两个指针错开)又称为龟兔赛跑算法,其基本思想就是使用两个移动速度不同的指针在数组或链表等序列结构上移动。这种方法对于处理环形链表或数组非常有用。
2024-03-19 18:51:41
1149
原创 【排序】对各种排序的总结
简单排序》(含:冒泡排序,直接插入排序,选择排序,计数排序)《希尔排序》《堆排序》《快速排序》《归并排序》我会再对他们的时间复杂度、空间复杂度以及稳定性再做一次总结,并且在不同的场景下,测试他们的性能怎么样。
2024-01-11 22:01:35
945
原创 【排序】归并排序(C语言实现)
归并排序(MERGE - SORT)是建立在归并操作上的一种有效的排序算法, 该算法是采用分治法(Divide andConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。所以在平时我们要使用归并排序时,使用递归版的完全够用了。但由于现在还在学习阶段,所以掌握一下非递归版的归并排序还是有必要的。可以像我们之前讲的快速排序的非递归一样使用栈吗?这里实现非递归的归并排序使用栈其实不是很好的方式,反而会使问题变复杂。
2024-01-11 22:00:37
379
原创 【排序】快速排序(C语言实现)
任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。Hoare思想挖坑法前后指针法三路划分以及快速排序的一些小优化,和递归与非递归的实现方式。阅读本章建议有一点二叉树的基础,如果对二叉树不太了解的可以看看:《初阶二叉树》这篇文章快速排序整体的综合性能和使用场景都是比较好的,所以才敢叫快速排序时间复杂度:O(N*logN)
2024-01-11 22:00:03
1025
原创 【排序】堆排序(C语言实现)
本章主要会讲堆排序的实现过程以及向上调整和向下调整的时间复杂度,在学习本章前,需要对堆、以及向上调整和向下调整有一个了解,如果不了解的话可以先看看这篇文章:《堆的实现及TOP-K问题》
2024-01-02 18:49:45
502
1
原创 【数据结构】堆的实现及TOP-K问题
在正式讲堆之前,我们要先来讲一下二叉树的顺序结构:普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段。
2024-01-02 18:47:57
901
原创 【数据结构 】初阶二叉树
设二叉树的根节点所在层数为1,层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第2层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历。若一个节点含有子节点,则这个节点称为其子节点的父节点;以某节点为根的子树中任一节点都称为该节点的子孙。一个节点含有的子树的根节点称为该节点的子节点;具有相同父节点的节点互称为兄弟节点;一个节点含有的子树的个数称为该节点的度;从根开始定义起,根为第1层,根的子节点为第2层,以此类推。
2024-01-01 13:04:05
880
原创 【C++】类与对象
/ 类体:由成员函数和成员变量组成// 一定要注意后面的分号class为定义类的关键字ClassName为类的名字{}中为类的主体类定义结束时后面分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。声明和定义全部放在类体中,需注意:成员函数如果在类中定义编译器可能会将其当成内联函数处理。成员函数名前需要加类名一般情况下,更期望采用第二种方式。但是如果函数体内的代码量如果少的话,还是建议直接写在类里面,因为这样可以被当做内联函数处理。
2024-01-01 13:00:39
811
原创 【排序】希尔排序(C语言实现)
本章将详细介绍希尔排序的思想及实现,由于希尔排序是在插入排序的思想上进行升华,所以如果不知道插入排序或者不熟悉的可以先看看这篇文章:《简单排序》中的直接插入排序。
2023-11-29 23:11:48
310
原创 【排序】简单排序(C语言实现)
我们常见的排序算法有下面这几种:在这几种算法中,有比较简单的,有也比较复杂的,所以这里我打算把简单的排序整合成一篇文章,比较难的我会单独写成一篇我们在讲排序算法的时候会提到稳定性的概念。⭐️:这里提一下:相同的数据排序后,相对位置是否发生变化。
2023-11-21 01:54:48
123
2
原创 【C++】内存管理
int main()// new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间还会调用构造函数和析构函数free(p1);delete p2;// 内置类型是几乎是一样的//C开辟空间的方式//C++开辟空间的方式free(p3);delete p4;free(p5);return 0;讲到这里我们实际上就能将new和。
2023-11-11 20:09:19
97
3
原创 【C++】类的默认成员函数
在C++的学习中,相信大部分人在构造函数的这块,学得不是很清楚,可能会使用,但不太懂它的一些规则,这篇文章,我会尽量的讲得简单易懂一点。但在看这篇文章之前,需要对类和对象有一个简单的认识。首先,我们先来见一见构造函数是什么样子的,先见一见它的庐山真面目,我们才能对它进行深刻的理解和学习:这里我写了一个日期类来进行讲解,请大家记住我在上图中用括号括起来的字,后面我们会对上面的话有一个全新的理解!!
2023-11-11 17:06:43
224
2
原创 【C++】入门
本章主要补充C语言过度到C++的一些语法,可能在本章体现不出这些C++的语法,但到后面会理解得越来越深刻。定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。// hyt是命名空间的名字,一般开发中是用项目名字做命名空间名。// 大家下去以后自己练习用自己名字缩写即可,如张三:zs// 1. 正常的命名空间定义// 命名空间中可以定义变量/函数/类型int val;//2. 命名空间是可以嵌套的。
2023-10-24 22:33:53
60
1
原创 【Linux】环境搭配
Linux在服务器领域的发展随着开源软件在世界范围内影响力日益增强,Linux服务器操作系统在整个服务器操作系统市场格局中占据了越来越多的市场份额,已经形成了大规模市场应用的局面。并且保持着快速的增长率。尤其在政府、金融、农业、交通、电信等国家关键领域。此外,考虑到Linux的快速成长性以及国家相关政策的扶持力度,Linux服务器产品一定能够冲击更大的服务器市场。
2023-09-21 14:38:19
77
原创 【C语言】程序环境和预处理
符号样例值含义__FILE__“myfile,c”进行编译的源文件名__LINE__25文件当前的行号__DATE__“”文件被编译的日期__TIME__“18:04:30”文件被编译的时间__STDC__1如果编译器遵循 ANSI C ,其值就为1,否则未定义这些预定义符号都是语言内置的。在VS中__STDC__是未定义的,所以我们在VSCode中来演示。如图:1000register//为 register这个关键字,创建一个简短的名字for;;
2023-08-13 23:02:44
140
5
原创 【C语言】文件操作
磁盘上的文件就是文件但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度分类的)。程序文件包括源程序(后缀为.c),目标文件(Windows环境后缀为.obj),可执行程序(Windows环境后缀为.exe).数据文件文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。在前面我们所学的处理数据的输入输出都是以终端为对象的,即从终端的键盘输入数据,运行结果显示到显示器上。
2023-08-10 01:20:32
157
2
原创 【C语言】动态内存管理
C语言提供了一个动态内存开辟的函数malloc这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。参数size的单位是字节。如果开辟成功,则返回一个指向开辟好空间的指针。如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。返回值的类型是void*,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来强制类型转换。malloc申请空间成功后直接返回这块空间的起始地址,并不会初始化空间的内容。如果参数size为0malloc。
2023-08-06 12:51:01
86
原创 【C语言】自定义类型:结构体,枚举,联合
有了结构体类型,那如何定义变量,其实很简单。int i;char c;//声明类型的同时定义并初始化变量p1,p2 //从这里不难看出,我们在初始化时不一定要按照顺序初始化 struct Point p3 = {30 , 'c' };//定义结构体变量p3,初始化的道理与上面是一样的int i;char c;int data;
2023-08-05 00:02:16
140
1
原创 【C语言】字符函数和字符串函数
C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在常量字符串中或者字符数组中。字符串常量适用于那些对它不做修改的字符串函数。📖:本章重点介绍处理字符和字符串的库函数的使用和注意事项求字符串长度strlen长度不受限制的字符串函数strcpystrcatstrcmp长度受限制的字符串函数strncpystrncatstrncmp字符串查找strstrstrtokatoi错误信息报告strerror。
2023-07-28 01:02:11
103
1
原创 【C语言】指针(详解)
在指针的简单了解这篇文章中,我们知道了指针的基本概念指针就是个变量,用来存放地址,地址唯一标识一块内存空间。指针的大小是固定的4/8个字节(32位平台/64位平台)。指针是有类型,指针的类型决定了指针的±整数的步长,指针解引用操作的时候的权限。指针的运算。本文将继续深入探讨指针。数组指针是指针?还是数组?答案是:指针。我们已经熟悉:整形指针:int * pint;能够指向整形数据的指针。浮点型指针:float * pf;能够指向浮点型数据的指针。
2023-07-21 22:49:08
661
12
原创 const int* p 与 int* const p的区别
当const 放在*前面的时候,限制的是指针指向的内容,不能通过指针变量改变指针指向的内容,但是指针变量本身是可以改变的当const 放在*后面的时候,限制的指针变量本身,指针变量的本身是不能被修改的,但是指针所指向的内容是可以通过指针来改变的const int*p == int const*p,都是在*前面,修饰的是*p,则*p不能被修改int* const p,在*后面,修饰的是p,则p不能别修改。
2023-05-23 10:52:02
306
1
原创 输入缓冲区
输入缓冲区:这是一个我们键盘输入与编译器读取之间的一个缓冲区域,编译器并不是直接读取我们在键盘上输入的信息,而是从输入缓冲区中读取的信息。我们使用scanf、getchar等输入函数时,并不是直接从键盘中去获取,而是由键盘打到输入缓冲区中,然后scanf,getchar等输入函数再从输入缓冲区里面去获取数据。
2023-04-24 19:50:29
1862
1
原创 VSCode编译多个.c文件
假设我们有一个工程,下面有多个文件需要编译,如下图我们可以先新建一个文件夹,并把文件拷贝到新建的文件夹底下然后我们用VSCode打开这个文件夹,如果还是之前的文件页面,我们可以先关闭当前文件夹,如下图然后打开我们之前新创建好的文件夹,如下图打开以后,我们能看到这两个文件,正是我们拷贝过来的。
2023-04-18 14:05:24
2636
5
原创 指针的简单了解
内存其实可以看成这些一块一块的内存单元组成的,而每一个内存单元都有属于自己的一个内存编号,也就是地址在C语言中,如果我们要创建一个变量的话,操作系统会随机分配所需的内存给我们使用,而我们可以通过这个地址访问到该变量。
2023-04-13 18:15:26
236
原创 关于VS中scanf函数报错的解决方法
就可以使用scanf了,可是如果我们每次创建一次源文件,就要加入这么一句语句,会不会很麻烦?这是因为微软公司觉得这个函数不安全,所以默认禁止使用,那如果想使用输入函数,应该怎么办呢?想必大家都遇到过这么一个情况吧,就是在VS中,使用scanf函数会出现报错。大家可以直接在这里搜索要查找的文件就可以快速找到了,而且还能看到路径。我们可以在newc++.cpp这个文件下,打开属性,然后点开安全。这个函数在其他地方是不被承认的,所以显然这不是最佳方法。,可是这样做的话,代码的可移植性就会变差了,因为。
2023-04-01 23:07:10
304
3
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人