自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C++——继承和多态

①可见不可见的含义是是否可被访问。不可见指不可被访问,但是不代表不存在,实际上private成员是存在的,只不过在子类中不可访问。所以可以理解为:继承是所有成员都被继承了,而访问限定符private决定了能否在子类中访问到这些继承的成员。②protected的成员只在自己类中和子类中可被访问。③public的成员在自己类、子类和类外均可被访问。④可以发现public继承后除了private外,public仍是子类的public,protected仍是子类的protected。

2024-07-19 16:35:56 711

原创 Linux——开发工具

yum是centos中的一个软件下载安装管理客户端,可以下载需要的软件或者解决依赖关系问题(如动态库)。程序都是来源于一段源代码,为了方便下载,源代码被提前在不同的环境下编译好生成对应的yum软件包,存储在服务器中。当需要进行下载时,可以通过yum找到对应的包并且同时处理好依赖关系。yum和rpm都是包管理工具,rpm是一种基础的包管理工具,需要自己动手解决依赖关系,而yum则是基于rpm拓展的高级包管理工具,可以自动解决依赖关系。

2024-07-09 20:03:05 887

原创 Linux——shell原理和文件权限

在我们使用云服务器时,需要通过shell进行使用,而shell则是一种外壳程序。我们提到过,大部分的指令实际上就是文件,当用户需要执行某种功能时,由于用户不擅长和操作系统直接交互(操作复杂),并且出于保护操作系统的目的(防止不合法请求交给操作系统),用户不直接使用操作系统内核,而是通过shell外壳程序来进行处理。外壳程序(shell程序)介于用户和操作系统之间的软件,也就是我们所见的命令行解释器。它可以将用户输入的命令进行检查并翻译给核心,而核心的处理结果也会通过shell翻译给用户。

2024-07-02 12:18:12 730

原创 C++——非类型模板参数、模板特化、模板分离编译

为了引出非类型模板参数,我们先介绍一种容器,叫做array,即静态数组。我们在之前的学习中接触过vector容器,vector容器是动态数组,在堆上动态开辟空间存放数据。而array不同,array也是数组,但是却是在栈上开辟的数组,所以这样的数组就具有了长度限制。总结来说,和vector对比,array是一个有着固定长度的静态数组,vector是一个长度可变的动态数组。array相当于把普通的静态数组进行了一定的包装,给出了一些方便使用的成员函数。

2024-06-14 20:11:09 1048

原创 C++——STL容器——stack、queue、priority_queue

优先队列实际就是我们所学过的堆的数据结构的容器,默认是大堆。之所以取名叫作优先队列,是因为对于堆而言,最有价值的就是堆顶的元素,因为堆顶的元素是所有元素中的最大或最小的一个,堆的各种应用也是利用了这一点。所以因为其首元素的特殊特征,所以认为是队列中优先级最高的元素,所以称为优先队列。priority_queue也是采取适配器模式,默认使用的底层容器是vector。栈和队列因为是FILO和FIFO,所以操作的均是头尾的元素,而deque的出现正是为了解决头尾操作问题的,所以它们默认使用了deque的容器。

2024-06-14 12:14:01 1004

原创 Linux——简单指令汇总

Linux,一般指GNU/Linux,是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯·本纳第克特·托瓦兹(Linus Benedict Torvalds)于1991年10月5日首次发布,它主要受到Minix和Unix思想的启发,是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统。它支持32位和64位硬件,能运行主要的Unix工具软件、应用程序和网络协议。本文主要介绍在使用Linux的过程中可能会使用到的比较基本的简单指令。

2024-06-03 16:56:02 2134

原创 Java——抽象类、接口、Object类、内部类

但是也有例外,接口中允许存在两种非抽象方法,由static修饰的方法和由default修饰的方法,他们可以有具体实现的方法体。③接口和类一样,也会生成对应的字节码文件。④由于抽象方法都是public修饰的,所以在重写时子类权限大于等于父类,所以只能是public修饰。

2024-05-22 17:43:09 1087

原创 C++——STL容器——List

为了实现迭代器正常功能所以将迭代器用类模板进行了封装,又为了const考虑增加两个模板参数来控制。it1->c1;//it1实际的类型是ListIterator,成员是ListNode的结构体指针,这个结构体是链表的结点,包含成员前序、后继指针和值//it1的构造函数将ListNode*类型的参数赋值给it1下的成员(链表结点指针),使用的是lt1调用的begin,返回值是ListIterator类型,其中的结点是头结点的下一个结点。

2024-05-16 02:06:09 1004

原创 C++——STL容器——vector

vector作为容器,应该支持任意数据类型的使用,所以vector使用模板类来实现,在使用的时候对模板类进行实例化即可。我们需要首先明确vector的迭代器如何实现。对于如vector和上一篇文章中的string而言,他们的存储空间是连续的,所以使用原生指针即可完成遍历和访问操作。在这里对迭代器的实现进行说明,一般而言,存储物理空间连续的容器,迭代器使用原生指针就可以了,因为此时迭代器的自增、begin和end等行为指针可以完美驾驭;

2024-04-30 12:16:08 371

原创 Java——多态

在父类的构造方法中是可以调用子类的重写方法的,但是由于子类初始化在父类之后,所以会产生问题,不建议这样使用。通过以上的介绍,可以为多态下一个定义了,多态就是对不同对象尽管看似调用了同一种方法,但是由于对象是向上转型的,方法是存在重写的,所以相当于父类对象调用了不同的子类的重写的方法,因此形成了多态。

2024-04-19 00:55:27 759 1

原创 Java——继承

编译器所加的是super()无参构造方法,这就说明。

2024-04-17 00:15:44 741

原创 Java——类和对象

在java中对于类的创建使用class关键字,其中包含成员变量和成员方法。//创建一个Book类//成员变量(属性)//成员方法(行为)System.out.println("读书");可以在IDEA中右键src进行新建包,包名以.作为分割符,即 xlz.pack.l4 为 xlz\pack\l4。然后就可以在这个包下新建输入这个包的类文件了,在包中的java文件会在最上方加上一个package语句指出在哪个包中。

2024-04-15 18:05:57 1080

原创 Java——数据类型、运算符、逻辑控制、方法、数组

Java是一门面向对象的编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。

2024-04-07 20:44:09 991

原创 C++——STL容器——string

在C语言中我们在处理字符串时采取的方案是使用一个字符数组,这样的方式对于我们管理和使用字符串会有一些麻烦。所以在C++中,一方面兼容了C语言中的字符串形式,另一方面则是通过内置的string类来进行管理。C++内置的string类配备了许多方便的成员函数,这对我们使用C++处理字符串提供了极大的便利,这篇文章主要是总结string类的使用方法以及一些特点,同时对于一些常用的函数我们会自主模拟一份,以帮助我们更细致地掌握细节。

2024-04-06 14:37:33 980

原创 C++——内存管理、模板

C++对动态开辟内存的方式使用new和delete操作符来对堆空间进行空间管理

2024-03-10 18:19:58 923

原创 C++——类和对象(5):static成员、友元、内部类、匿名对象

在类中可以使用static来修饰成员变量或者成员函数,使之成为静态成员变量或者静态成员函数。。在类中声明,在类外定义(定义时注意类的域限定符)。没有this指针,所以可以不通过实例化后的对象进行调用,但是只能访问类中的静态成员。静态成员依旧收到访问限定符的限制。

2024-03-08 00:20:19 834

原创 C++——类和对象(4):取地址及const取地址操作符重载、初始化列表

且在初始化列表每个成员变量只能出现一次(只能定义并初始化一次)。在。

2024-03-08 00:17:41 1075

原创 C++——类和对象(3):运算符重载、日期类

所以如果成员变量存在申请资源的,需要自己写出深拷贝以避免出错。⑤与拷贝构造函数进行一个区分,拷贝构造函数用在初始化,而赋值运算符重载用在使用的过程中进行赋值操作的过程。

2024-03-01 13:32:45 597

原创 C++——类和对象(2):构造函数、析构函数、拷贝构造函数

我们将什么成员都没有的类称为空类,但是空类中并不是什么都没有。任何类中都会存在6个默认成员函数,这6个默认成员函数如果用户没有实现,则会由编译器默认生成。 6个默认成员函数包括:负责初始化工作的构造函数;负责清理工作的析构函数;在用同类对象对创建对象进行初始化时用到的拷贝构造;用于对象之间赋值的赋值操作符重载;还有两个很少自己实现的取地址操作符重载和const修饰的取地址操作符重载。 构造函数是一个特殊的成员函数,帮助我们对新创建的对象进行初始化。构造函数说明

2024-02-27 22:24:11 999

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

声明和定义同时放在类体中,这种方式比较简便,就像C语言阶段的声明定义不分离一样。int _month;int _day;这种方法类似于C语言中的声明和变量分离,比较规整并且便于合作开发。这种方法需要注意类的作用域,即需要 类名::成员名 来指明成员所属的类域。int _month;int _day;date.cpp。

2024-02-25 16:21:37 1039

原创 C++——基础语法(3):内联函数、auto关键字、基于范围的for循环、空指针nullptr

在函数前加入inline修饰即可将函数变为内联函数。所谓内联函数,就是在编译时C++编译器会将函数体在调用内联函数的地方展开,从而省去了调用函数的栈帧开销,提高程序运行效率。对上述代码,在Debug版本下,我们观察汇编代码,发现仍然调用了函数Add而不是我们希望的内联展开形式。这是因为内联函数展开后就不可调试了,而Debug版本为了方便我们调试,因此忽略了inline的选项。为了可以看到内联函数的变化,我们可以做出如下设定,再在X86环境下编译程序,这样Debug版本也可以实现内联了。

2024-02-24 21:35:14 558

原创 C++——基础语法(2):函数重载、引用

4. 函数重载 函数重载就是同一个函数名可以重复被定义,即允许定义相同函数名的函数。但是相同名字的函数怎么在使用的时候进行区分呢?所以同一个函数名的函数之间肯定是要存在不同点的,除了函数名外,还有返回类型和参数两部分可以视为函数的特征。 以返回类型来区别,因为在函数调用时不能显式地指出函数返回类型,所以难以使用返回类型来区别。因此只剩下了参数来区分,我们可以总结出以下三种常见的函数重载的情况:①参数个数不相同:void func(int a, int b){

2024-02-24 00:58:59 910

原创 C++——基础语法(1):命名空间、输入输出、缺省参数

命名空间的定义使用关键字namespace,然后接命名空间的名字,然后使用{}包含所有命名空间的成员。需要注意:①命名空间中可以定义变量、函数、类型;②命名空间可以嵌套定义;③如果定义了相同名称的命名空间,编译器会将其合并为一个。//命名空间的定义//命名空间内可以定义变量、函数、类型,也可以嵌套其他命名空间int a = 9;int val;int a = 8;char c;//相同名称的命名空间最后会被编译器合并成为一个int b;

2024-02-22 17:42:26 731

原创 排序(6)——冒泡排序、计数排序

计数排序给我的感觉就是众多排序算法中的民间高手。虽然方法不入流,适用范围不广,但是架不住它真的快。排序算法简单说就是统计所有数据出现的次数,然后根据统计的次数从小到大再将数据依次输出。说它不入流是因为我感觉计数排序并非真正的排序,这种统计次数再输出的方式并不是对于原数组进行数据的处理,这也就注定了它的适用范围并不会很广。计数排序只能用于数据跨度较小的整数排序上。

2024-02-03 12:32:21 763

原创 排序(5)——归并排序

归并排序也是一种很经典的排序算法,采用分治的思想方法进行数据的处理。归并讲究的是先拆后合,也就是分治中的分而治之。在拿到一组数据后,程序会将整个数据进行不断拆分直至有序,因为单个元素必然有序,所以归并排序最后拆分形成的组每组只有一个元素。对于这些已经有序的组别,再进行治,就是合并两个有序序列。如此采取先分再合的策略使得一组数据最后成为有序。

2024-02-02 15:50:36 955

原创 排序(4)——快速排序

快速排序是Hoare于1962年提出的,主要采取了分治的思想。快速排序首先确定一个基准值,然后以这个选出的基准值为标准,将整个数组进行按大小进行区分,使得小于该基准值的位于其一侧,大于基准值的位于另一侧。这样就将整个数组分为了小于标准和大于标准两部分,再对每一部分进行同样的处理方法由此完成排序。快速排序在每一趟的执行中,因为基准值左侧均是小于,右侧都是大于,所以一定会确定基准值的位置,从而使得分治的下一步会分别处理左侧右侧两部分而不再包含该基准值,所以递归可以顺利进行下去。

2024-02-01 19:44:52 946

原创 排序(3)——堆排序

堆排序,看名字就能知道这种排序是基于堆这种数据结构所设计出的一种排序方式。堆排序实际上是基于选择排序做出的一些升级。选择排序是通过每次遍历的方法来选出最大元素,毫无疑问限制其效率的主要因素就是遍历的开销,那么有没有其他方法能够高效实现选数呢,这时候堆就脱颖而出了。我们知道堆顶的元素是具有特殊性质的。对于大堆,堆顶的元素就是最大值;对于小堆,堆顶元素就是最小值。因此我们将待排序数据构成一个堆,那么选数不就很容易了。这也正是堆排序的核心所在。

2024-01-31 20:44:34 865

原创 排序(2)——选择排序

选择排序主要采取的排序策略就是选择,在拿到待排序数组后,程序会一遍遍地遍历未排序部分数组,在每一次的遍历过程中会找到最小的元素,并在遍历完成后换到未排序数组部分的最左侧。如此循环往复,每一次遍历选出一个最小的数据进行排序,最后达到整个数组有序。选择排序思想方法很简单,就是比较找到最小,然后交换,一次排好一个元素。我们也可以将选择排序做一些优化,比如每次选出一个最大的和一个最小的,分别排在左端和右端,这样排序是从两端同时开始,效率加倍。本文的选择排序就采取这种方法,一次遍历选出最大值和最小值。

2024-01-29 20:53:24 382

原创 排序(1)——直接插入排序、希尔排序

顾名思义,直接插入排序就是将数据直接插入到顺序之中。详细而言就是面对一个数组,假定某一位置之前的元素已经有序,需要将该元素也排入顺序之中,那么就需要这个元素与之前的顺序序列一一比较,找到其合适的位置插入进去。希尔排序是由DL.Shell于1959年提出,因而被命名为希尔排序。希尔排序可以看作是插入排序的升级版,它对插入排序取长补短。

2024-01-27 21:23:56 1048

原创 Top-K问题——堆的应用

Top-K问题是一个堆结构的经典问题,要求我们对给出的一组数据选出其中最大或者最小的k个元素。在拿到这个问题时,第一反应肯定都是排序,然后取所需要的k个元素即可。但是Top-K问题的数据量一般都很大,对其进行排序只为找到那短短k个元素,这个性价比怎么想怎么不甘心。除此之外,我们所学的排序算法多为内排序,当数据量大到一定程度时甚至有可能内存中脸数据都放不下。那么有没有其他方法可以更好地解决这个问题呢?这时,我们就可以搬出刚刚学过的堆来解决这个问题了。

2024-01-26 20:40:34 403

原创 数据结构——链式二叉树

对于二叉链的树而言,我们以链表的形式组织整棵树结构。因为二叉链要求在携带数据的同时,需要标明其左右孩子,因此我们定义的结构体中,有着两个指针,分别指向左右孩子。}BTNode;这两篇博客我们一共接触了两种二叉树的实现方式,分别是顺序二叉树和链式二叉树。其在实践中有着不可小觑的作用。对于顺序二叉树,我们需要对堆的数据存储方式加强理解,掌握大堆小堆的特征与控制方式;对于链式二叉树,因为其采用了大量的递归,所以对我们训练递归的思维是个很好的训练,而且从控制二叉树的过程中,能窥见一些更深奥的知识。

2024-01-25 21:33:51 1104 1

原创 数据结构——顺序二叉树——堆

因为我们已经明确了,堆是使用数组进行存储,所以堆的实现方式应该和顺序表相同。int size;}HP;

2024-01-14 21:56:13 1214 1

原创 数据结构——队列(Queue)

队列,顾名思义,作为有素质的新时代公民,在现实生活中我们常常会遇到排队的场景,而队列就是借此种情形衍生出来的数据结构形式。在需要排队的时候,我们面对一个队列会自觉地站在队尾。随着当队伍中的人慢慢出队,我们的位置也从队尾慢慢移动到了队头,当我们成为一个队的第一个人时,我们就明白终于轮到我们出队了。队列这种数据结构组织数据的形式和排队的场景十分相似,均为先进先出,后进后出的规则。在掌握了栈这种数据结构的基础之上,我们再来学习队列会比较轻松。

2024-01-08 17:43:28 1361

原创 数据结构——栈(Stack)

栈这个东西我们并不陌生,有过一些基础知识的同志都知道,在存储器映像中就有一块存储区域被称为栈。这个栈主要是存储非静态局部变量,函数调用所开辟出的栈帧也在这块区域。先进后出,后进先出。在程序运行时(以Linux+IA32为例),栈顶指针esp在面对push和pop指令时会对应的减或加,栈空间的开辟和释放都是由esp指针来标定的。所以可以看到在栈区内,当要完成空间释放或申请时,总是在对最顶部的空间进行操作,即满足“先进后出,后进先出”的规则。

2024-01-07 20:11:09 1250

原创 数据结构——带头循环双向链表(List)

为了实现链表的双向结构,我们需要从定义入手。单链表的链表结点定义是一个指向下一个结点的指针,而双向链表则需要两个指针,分别指向上一个和下一个结点。}LTNode;

2023-11-26 18:16:31 570

原创 数据结构——单链表(Singly Linked List)

建立一个单链表需要多个结点共同构成,我们针对单链表一个结点进行定义,将其定义为一个结构体,包含数据和下一个结点的指针。}SLNode;无头单向不循环链表,这种链表虽然结构简单但是应用广泛。在最近的学习过程中,我发现不少与链表有关的题目多用单链表来设题,除此之外,一些更加复杂的结构也需要用单链表作为支撑,所以可以看出其重要性。除此之外,恰恰是因为其结构简单,所以对特殊情况的限制较少,这就需要我在写代码时充分考虑可能会发生的所有情况,以便做出合理控制。

2023-11-25 00:36:38 523

原创 数据结构——顺序表(SeqList)

顺序表,顾名思义就是顺序储存数据的数据管理方式。在物理层面来看,顺序表将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。因为顺序表采用的是一段物理地址连续的储存单元一次存储数据元素,所以我们一般会采用数组的方式来存储。涉及到数组的存储,我们便会有两种方式,一种是静态的顺序表,即使用定长的数组来存储元素;而我们今天介绍的是另一种动态的顺序表,即采用动态开辟的数组进行数据的存储。

2023-11-03 12:46:07 565

原创 C语言——二周目——程序的翻译与执行环境

对于一个C语言程序的实现,整个过程一般存在两个不同的环境,分别是翻译环境与执行环境。在翻译环境中,我们所写的源代码经过一系列处理被转换成为可执行的机器指令;在执行环境中,会实际执行代码。整个程序在这两个环境中处理,由我们所写的.c文件最后变为.exe文件。该图便是程序在翻译与运行过程中的流程,每一个源文件通过编译转换为单独的一份目标代码,这些生成的目标文件最后由链接器捆绑在一起,链接器同时引入标准库与个人库内容,从而形成一个单一而完整的可执行程序。以下的内容,我们会一一介绍这些流程具体做了哪些事情。

2023-10-21 14:06:22 654

原创 C语言——二周目——输入输出辨析

以往的输入为默认形式(标准输入流——stdin——键盘)。但是输入的形式不止此一种。可以从键盘上敲出输入的数据,同时也可以将文件中、某个字符串甚至结构体的数据作为输入内容进行输入。输入,即为从某个地方获取数据。如各种get家族、各种scanf家族、以及fwrite,均是选择一个数据来源,获取该来源的数据。

2023-10-19 21:29:47 421

原创 C语言——二周目——数据在内存中的存储

我们所熟知的int类型通常在内存中占用4个字节的空间,而short类型占用2个字节,char类型则使用1个字节的空间。2)E有可能为负数,所以存入E时会加上一个中间数,E为8位时中间数为127,E为11位时中间数位1023。②E全为0:此时E的真实值为-127(-1023),有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数,以表示+-0或接近于0很小的数字。②对于一个有符号整数家族的类型,其所能表示的最小的负数为符号位取1,其余位取0;③E全为1:此时如果有效数字M全为0,表示+-无穷大。

2023-10-16 22:36:37 126

空空如也

空空如也

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

TA关注的人

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