自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 红黑树与map、set的封装

简单了解红黑树上一篇博客我们了解了AVL树的插入实现,其插入搜索时间复杂度是O(logN)级别的。而红黑树也是一颗平衡搜索二叉树,但是与AVL树不同的地方在于,红黑树的平衡策略是近似平衡,而非AVL树的完全平衡。可能有小伙伴就会问了,不是越平衡效率越高吗?为什么更多地方采用的是红黑树而非AVL树呢?这里就要从红黑树近似平衡的特点说起了,由于平衡限制的并不那么严格,所以红黑树通过旋转调整平衡的次数相比AVL树就更少了,也就是说红黑树的插入会比AVL更快。而红黑树通过一系列规则,将根节点到叶子结点的最长

2022-06-03 19:28:27 281 2

原创 AVL树的插入

为什么需要AVL树?我们知道搜索二叉树通过对每一个结点限制规定:左子树都比比根节点小,右子树比根节点大,来达到O(logN)的搜索效率的:​​但是一般的搜索二叉树还有一个很严重的问题:当左右子树高度差很大时,会导致搜索效率极度退化,甚至在顺序插入时退化至O(N):很明显,普通的搜索二叉树在一些情况下并不能达到预期的O(logN)搜索效率,而其原因就是高度的极度不平衡。而AVL树就通过旋转的方式来维持搜索二叉树的平衡,AVL树得名于它的发明者G. M. Adelson-Vels

2022-05-29 12:58:45 2476 1

原创 程序虚拟地址空间

在学习计算机语言时,我们了解到一个进程会占用一定的内存空间。而一个进程占有的内存空间又被分为栈区、堆区等。我们可以绘制下图来说明一个程序的地址。(省略命令行参数与环境变量、内核区部分)。但是想必大家对内存这个经常接触的事物仍有许多疑惑,例如:为什么内存空间要被叫作虚拟地址空间呢?而且我们会发现,任何程序的地址好像都是从0开始,那许多进程同时运行的话,地址不会冲突吗?运行下面这段代码,我们还会发现更奇怪的现象。#include <iostream>#include <

2022-03-17 22:19:05 386

原创 vector迭代器失效分析

我们在使用迭代器时,常常会遇到迭代器失效的情况。一旦迭代器失效,就可能出现各种意想不到的错误,下面,我们就来分析迭代器失效的原因,以及迭代器失效的解决办法。

2022-03-14 22:51:07 2245 1

原创 string类的深浅拷贝

1.浅拷贝在学习string的时候,我们会遇到需要对string类进行拷贝的情况。通常,我们进行数据拷贝只需要将一个类里的基本数据进行值拷贝即可。但是实际上,直接进行值拷贝对于string类来说是不合理的。class string{ //... string& operator=(const string& s)//看似正确的拷贝方式 { _str = s._str; _size = s._size; _capacity = s._capacity; ret

2022-03-05 11:24:57 3425

原创 C++之模板入门

1.函数模板在C语言中实现一个加法的函数并不困难。int add(int x, int y){ return x + y;}但是很明显,这个函数限定了两个相加的数都是整数,并且其返回值也为整数。但是,如果我们想得到两个双精度浮点数相加的结果呢?那么add函数可能就要写成:int addint(int x, int y){ return x + y;}double adddouble(double x, double y){ return x + y;}那么,如果我

2022-02-22 17:49:11 738

原创 Linux中的权限

1.权限是什么生活中的权限处处可见,没有门票,就进不去特定的场所。没有会员,就没法看某些电影、电视剧。而在Linux中,权限是指用户能否对文件读、写、执行。用户分为超级用户(root)与普通用户。以超级用户的身份在Linux下做任何事情,不会受到限制。而普通用户则会受到权限的约束,所以一般而言,Linux中的权限是指对普通用户的限制,而超级用户则不受权限的约束。在linux下,使用 ll 命令可以看到当前路径下所有文件的详细信息,而在信息的开头我们能看到类似于-rw-rw-r--的十位字母组合。

2022-02-09 13:08:25 1806

原创 构造函数中的初始化列表

对于日期类,我们可以使用如下构造函数 Date(int year = 1900, int month = 1, int day = 1) {//这里的构造函数没有判断日期合法性,仅用来举例 _year = year; _month = month; _day = day; }显然这是没有问题的。但我们要知道,在构造函数的函数体内进行的是成员变量的赋值,而成员变量的初始化则是在初始化列表中进行的。初始化的格式:以 冒号开始,每一行是一个成员变量,后面跟着括号,括号里面放初始值,每

2022-01-23 14:37:03 599

原创 类和对象之日期类的实现

通过类和对象的了解我们可以知道,类是一种自定义类型。今天我们就要创建一个可以保存某一天的年、月、日三个信息的类。此外,这个类还可以完成一些相对基础的操作,例如计算两个日期之间相差多少天、比较两个日期的大小等。一个类最基础的就是六个默认成员函数,他们分别是构造函数,析构函数,拷贝构造,赋值重载,以及两个不常用的取地址及const对象取地址。由于后两个不常用,下面的实现中不会进行说明。1.构造函数与析构函数一个类最基础的功能就是初始化与清理,所以我们先讲讲这两个函数的实现。首先是构造函数,构造函

2022-01-18 01:24:37 639

原创 初识类和对象

1.什么是类和对象?在C语言中,并没有类和对象这个概念。而在C++中,引入了这个概念。提到类和对象,我们先要了解什么是面向过程和面向对象。在一个外卖系统中,面向过程的设计思路是将送餐、下单、接单等操作直接罗列出来并单独进行设计。而对于面向对象,我们可以设计出用户、商家、配送员这三个类。而用户下单、商家接单、配送员送餐则是不同类之间的交互操作。在C语言中实现栈,我们会通过一个结构体储存一个栈的所有数据:指向栈空间的指针、栈顶元素、栈的大小等数据。而操作栈的函数则与数据分离,保存在栈结构体之外。

2022-01-15 20:30:51 1088

原创 C++中引用的概念以及使用

1.引用的概念通俗的说,在C++中,引用的作用是给变量起外号。下面我们举个例子来说明:int a = 10;int& b = a;//引用的声明方式:类型标识符 &引用名=引用对象在上面的语句中,a是一个整形变量,而b是a的引用。cout << a << endl;cout << b << endl;//输出结果为://10//10输出a和b的值,我们会发现,b所存的值与a所存的值相同。当我们对b所存的值进

2021-12-05 17:02:28 968

原创 快速排序详解

1.什么是快速排序我们知道排序有很多种,常见的如希尔排序,插入排序,选择排序,堆排序等等,而快速排序也是排序家族中的一员。因为其在大多数情况下有着优秀的综合性能,快速排序的快速也算是实至名归,接下来就为大家讲解快速排序的思想与实现。2.快速排序的核心思想快速排序通过多次比较与交换来完成排序。而这个过程又被分为了多次重复单趟排序,接下来我们先从每一趟的排序讲起。快速排序的单趟排序思想是:在一个无序数组中取一个数key,每一趟排序的最终目的是:让key的左边的所有数小于key,key的右边都

2021-11-19 16:57:43 112531 20

原创 OJ题:设计一个循环队列

(本题取自LeetCode622.设计循环队列)1.题目介绍循环队列是指一种线性的数据结构,该结构遵循先进先出的原则,并且队尾则被连接在队首之后以形成一个循环。循环队列可以循环使用队列之前用过的空间,普通队列的头元素前的节点不能再使用,而循环队列可以在队列没有满之前循环的使用空间。对于循环队列我们需要支持如下的操作:1.构造一个队列长度为k的循环队列2.从队首获取元素,若队列为空则返回-13.获取队尾元素,若队列为空则返回-14.向循环队列插入一个元素,若成功插入则返回.

2021-11-01 21:54:08 503 2

原创 双向带头循环链表的介绍与实现

双向带头循环链表是结构上最为复杂的一种链表,但是正是因为其结构复杂,也给这种链表带来了其他链表所没有的优势。今天我们就介绍一下双向带头循环链表并且完成其构建。1.双向 带头 循环都是什么意思?2.双向带头循环链表的结构...

2021-10-29 21:34:26 384 3

原创 堆与堆排序

堆排序是指利用堆这种数据结构对数据进行排序的算法。要了解堆排序,我们要先对堆进行一定的了解。堆堆是一种特殊的完全二叉树。在完全二叉树的基础上,堆还有以下特点:堆的每个父节点都大于等于其所有子节点 这类堆被称为大堆或者堆的每个父节点都小于等于其所有子节点 这类堆被称为小堆比如下面的二叉树就是一个小堆堆的向下调整算法了解了堆的基本概念后,我们来了解如何将一个完全二叉树转变为堆。首先,我们可以利用向下调整算法将一个左右子树都为堆(要得到小堆则两个子树都要是小堆,要得到大堆.

2021-10-23 14:34:38 229

原创 从树到二叉树入门

1.堆是什么?堆是一种特殊的完全二叉树。堆的特点是,它满足:它的每一个父节点都父节点的值大于它的两个子节点的值 或者 它的每一个父节点都父节点的值小于它的两个子节点的值。若它的根为最大值则称之为大根堆,若它的根为堆节点里的最小值则称之为小根堆。...

2021-10-16 13:21:34 364 1

原创 与随机读取有关的函数

通过文件操作我们可以实现对通讯录的保存,但是要在文件的具体位置进行操作,又要怎么实现呢?下面我们介绍与随机读取操作有关的三个函数。fseek函数fseek函数可以实现文件指针的偏移操作。fseek函数的声明如下int fseek(FILE *stream, long int offset, int whence)其中stream为要操作的文件指针,offset则为文件指针的偏移量,whence则为偏移offset的起始位置,whence一般指定为SEEK_SET:文件的起始位置、SEE

2021-10-04 16:07:14 210

原创 用C语言实现文件版的通讯录

1.为什么要进行文件操作在往期,我们使用C语言构造过通讯录,但是无论是一次性开辟好空间的通讯录,还是动态版的通讯录,都无法做到退出通讯录后将信息保存下来。但是通过文件操作,我们可以在退出通讯录时将信息保存到文件中,并且在再次打开时读取信息到程序中,以达到每次打开时能信息的功能。2.如何保存通讯录在C语言里,有文件操作函数帮助我们将程序中的信息保存到文件中。为了保存通讯录,我们将会用到fopen,fclose,fwrite以及fread函数。通过这四个函数,我们可以在关闭程序时将信息写入到文件中,

2021-10-04 11:38:40 356

原创 通讯录的动态版本的实现

前几天我们使用C语言创建了一个固定大小的通讯录,这次我们在原有的基础上将其修改为动态大小的通讯录。1.malloc、calloc、realloc以及free函数的介绍1.malloc与calloc函数malloc函数的函数声明为void *malloc(size_t size)其函数功能为,在堆上开辟一块size个字节的空间,开辟成功后以void*类型返回这块空间的起始地址。若开辟失败,则返回NULL。calloc函数的函数声明为void *calloc(size_t nit

2021-09-23 22:11:01 145

原创 用C语言实现通讯录

1.框架构造首先,为了构造一个通讯录,我们定义一个结构体peoinfo存放每个人的信息:#define NAME_MAX 20#define SEX_MAX 5#define TELE_MAX 12#define ADDR_MAX 20struct peoinfo//定义一个结构体保存一个人的信息{ char name[NAME_MAX];//姓名 int age;//年龄 char sex[SEX_MAX];//性别 char tele[TELE_MAX];//电话

2021-09-18 17:57:50 1537

原创 C语言<string.h>头文件所包含的部分函数的解析

strlenstrcatstrcpystrcmpstrncatstrncpystrncmpstrtokstrstrmemmovememcpy

2021-09-15 19:50:15 1321

原创 C语言指针指针练习讲解

你能思考得到如下程序运行的结果吗?#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>int main(){ char* c[] = { "enter","new","point","first" }; char** cp[] = { c + 3,c + 2,c + 1,c }; char*** cpp = cp; printf("%s\n", **++cpp); printf("%s\n", *-- * ++cpp + 3

2021-09-08 18:14:19 578 1

原创 用冒泡排序模拟实现qsort函数

有这么一个问题。给定一个包含[0, n]中n个数的数组nums,找出[0, n]这个范围内没有出现在数组中的那个数。

2021-09-07 14:16:46 228

原创 数据在内存中的存储

我们知道在程序运行时,我们的数据通过二进制的形式存储在内存中。但是数据具体是如何存储的呢?我们来进行详细的说明。

2021-08-09 18:21:01 295

原创 函数栈帧的创建和销毁

本文章将概括性的介绍C语言,让读者对C语言有初步的认知。C语言是计算机上的一门语言,其设计初衷是为了方便人们对计算机进行操控。在计算机设计之处,科学家便对二进制位jin

2021-08-07 17:28:39 135

原创 用C语言实现一个扫雷小游戏吧~

目录1.扫雷游戏的介绍2.代码的实现2.1菜单与游戏入口2.2棋盘的初始化2.3放置地雷2.4打印地图2.5正式扫雷3.代码分享3.1game.h3.2game.c3.3test.c1.扫雷游戏的介绍 小时候谁不会在电脑课上偷偷点开Windows菜单里的游戏列表呢。蜘蛛纸牌,三维弹球,扫雷,空当接龙...一个个经典小游戏想必是印象深刻了。今天我就带大家还原一下Windows自带小游戏中的经典:扫雷。 虽然说扫雷这游戏很多人都玩过,但可能有些...

2021-07-28 23:00:34 209

原创 C语言入门:制作一个三子棋小游戏吧~

今天带大家用C语言制作一个三子棋小游戏~ 打开VS,这里我们建立源文件test.c(用于测试功能)game.c(用于保存游戏主体函数)以及一个game.h头文件。建立好了文件,接下来就要一步步确立游戏的流程,并构造游戏整体的框架。 一个游戏,总得要个菜单引导玩家进行操作吧,那么我们在进入游戏之后,打印一个菜单,并且引导玩家进行选择。这里我们构造一个print_menu函数进行实现。 我们使用do while语句进行循环,让玩家可以多次游玩。while()控制条件放入玩家输入...

2021-07-27 19:54:22 549 3

原创 Hello World

就读于湖南科技大学 一位普普通通的大二学子 虽然对计算机有着浓厚兴趣但很遗憾被调剂到材料学院 但是并不影响对计算机的热情 相信怀揣着热情并坚持bian'ke'y

2021-06-03 18:34:06 222 1

空空如也

空空如也

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

TA关注的人

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