自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C++11:现代C++的演变与提升

在2003年,C++标准委员会发布了一份技术勘误表(简称TC1),使得C++03取代了C++98成为C++标准的最新版本。然而,C++03(TC1)主要集中于修复C++98中的缺陷,而语言的核心部分并没有重大变化。因此,人们通常将这两个标准统称为C++98/03。C++11,这个被称为“C++0x”的标准,经过十年的发展终于正式发布。与C++98/03相比,C++11带来了许多显著的变化和改进。

2024-09-26 00:09:16 896 2

原创 高阶数据结构之哈希表基础讲解与模拟实现

哈希表(Hash Table)是一种高效的键值对存储数据结构,广泛应用于各种需要快速查找的场景,如数据库索引、缓存系统、集合等。它的基本思想是通过哈希函数将键映射到哈希表中的一个位置,从而实现快速的数据插入、删除和查找操作。下面我们将详细介绍哈希表的工作原理、实现方式、优缺点以及应用场景。哈希表作为一种重要的数据结构,提供了高效的查找、插入和删除操作。通过设计良好的哈希函数和适当的冲突解决策略,可以最大化哈希表的性能。

2024-09-12 23:11:55 1021 2

原创 二叉搜索树进阶之红黑树

红黑树在计算机科学中有着广泛的应用,尤其是在需要频繁插入和删除操作的数据结构中。虽然其实现较为复杂,但红黑树通过严格的平衡规则和旋转操作,能够提供稳定、高效的性能表现,是一种非常重要的自平衡二叉搜索树。了解红黑树的基本性质和操作过程,对于深入理解高级数据结构以及其在实际应用中的优化是非常有帮助的。希望本文对您有所帮助!!

2024-08-29 22:00:35 848 3

原创 搜索二叉树进阶之AVL树

AVL树是Adelson-Velsky和Landis在1962年发明的一种自平衡二叉搜索树。它的特点是通过对树进行旋转操作来保持平衡,以确保在最坏情况下,树的高度仍然是O(log n),从而保证插入、删除和查找操作的时间复杂度都是O(log n)。AVL树作为自平衡二叉搜索树的经典实现,通过对树的高度进行严格控制,确保了高效的查找、插入和删除操作。尽管其操作复杂度较高,但在需要频繁查找和维护较大数据集的场景中,AVL树无疑是一种值得选择的数据结构。

2024-08-23 23:50:45 897 6

原创 map与set容器初识:初步运用map与set

在本文中,我们通过多个实际例题,深入探讨了map和set容器的常见操作和实际应用。这些容器在处理数据的过程中能够提供强大的支持,尤其在涉及到元素的唯一性、快速查找和数据关联的场景下。学习map和set容器不仅仅是掌握其基本用法,更重要的是通过实践,理解它们在不同场景中的应用和优势。本文的示例和解析,希望能帮助读者更好地掌握这些工具,并在今后的算法和编程实践中更加得心应手。通过不断练习,读者可以熟练地将map和set应用于各种复杂的数据处理任务中,从而提升编程效率和代码质量。

2024-08-21 21:58:23 1141 7

原创 二叉树进阶之二叉搜索树:一切的根源

在学完了简单的容器与C++面向对象的三大特性之后,我们首先接触的就是map与set两大容器,但是这两个容器底层实现的原理是什么呢?我们不而知,今天,主要来为学习map与set的底层原理而打好基础,而二叉搜索树,则是一切的开端......一、二叉搜索树的定义与性质: 对于每个节点N,其左子树中所有节点的值都小于N,右子树中所有节点的值都大于N。: 对二叉搜索树进行中序遍历(左-根-右)时,节点的值按升序排列。: 在平均情况下,查找、插入和删除操作的时间复杂度都是 O(log n)。

2024-08-17 21:59:38 829 11

原创 Linux初启征程指南:攻克常见系统指令与权限初理解

Linux是一个基于UNIX的开源操作系统,其核心(Kernel)是由Linus Torvalds在1991年首次发布的。它的设计初衷是为个人计算机提供一个免费的、开源的操作系统,但由于其强大的性能和安全性,如今被广泛应用于服务器、超级计算机、嵌入式系统等多个领域。因此对于我们这群程序员来说,学好Linux也自然是不可避免的事情。(糟糕,头发不保了!!!)下面就斗胆让作者我来给大家介绍一下Linux系统的常用指令啦。注意,以下指令的演示都是通过Xshell,CentOS 7.6 64bit版本进行。

2024-08-08 22:01:07 957 5

原创 继承与多态常见面试题解析

3. 面向对象设计中的继承和组合,下面说法错误的是?()A:继承允许我们覆盖重写父类的实现细节,父类的实现对于子类是可见的,是一种静态复用,也称为白盒复用B:组合的对象不需要关心各自的实现细节,之间的关系是在运行时候才确定的,是一种动态复用,也称为黑盒复用C:优先使用继承,而不是组合,是面向对象设计的第二原则D:继承可以使子类能自动继承父类的接口,但在设计模式中认为这是一种破坏了父类的封装性的表现。

2024-07-26 00:41:52 976 4

原创 探索C++中的多态性:理解虚函数和运行时多态

在现代软件开发中,面向对象编程(OOP)已经成为了主流。其中一个强大的概念就是多态性(Polymorphism),它不仅仅是一种技术,更是一种设计思想和实现方式,为软件开发带来了巨大的灵活性和可维护性。多态性允许我们使用统一的接口来处理不同类型的对象,同时根据对象的实际类型来调用适当的方法。这种动态绑定的特性不仅提高了代码的复用性和可扩展性,还使得软件系统能够更好地适应变化和需求的增加。本博客将深入探讨C++语言中多态性的各个方面:从基本概念到实际应用,从虚函数到虚函数表,从继承到接口隔离。

2024-07-23 23:41:06 897 4

原创 C++面向对象三大特性:继承

public继承是一种is-a的关系。也就是说每个派生类对象都是一个基类对象。组合是一种has-a的关系。假设B组合了A,每个B对象中都有一个A对象。继承允许你根据基类的实现来定义派生类的实现。这种通过生成派生类的复用通常被称为白箱复用(white-box reuse)。术语“白箱”是相对可视性而言:在继承方式中,基类的内部细节对子类可见。继承一定程度破坏了基类的封装,基类的改变,对派生类有很大的影响。派生类和基类间的依赖关系很强,耦合度高。对象组合是类继承之外的另一种复用选择。

2024-07-20 23:26:26 818 1

原创 C++初阶编程:list容器的简单模拟实现

在C++标准库中,list是一种双向链表容器。这里简单提一下双向链表——什么是双向链表呢?一个存储数据的字段。(我们通常用_data表示)一个指向前驱节点的指针。(我们通常用_prev表示)一个指向后继节点的指针。(我们通常用_next表示)这样,每个节点都知道它的前一个节点和后一个节点,从而支持在常数时间内进行插入和删除操作。在实现list之前,我们要先定义一下这个链表的节点结构。一个链表是有多个节点链接组成,所以节点自然是重中之重。

2024-06-29 19:45:42 906 1

原创 C++编程:vector容器的简单模拟实现

在C++标准库(STL)中,vector容器是最常见使用的动态数组。它结合了链表与数组的优点,提供了灵活的大小调整与高效的随机访问。本文将简单的对vector容器进行介绍并且对vector容器简单的模拟实现。1. vector是表示可变大小数组的序列容器。2.就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。3.本质讲,vector。

2024-06-16 21:44:51 1017 1

原创 C++编程:模板初阶

函数模板是一种用于定义一组相关函数的蓝图。这些函数模板在使用时会根据实参类型生成具体的函数版本。T c = a;a = b;b = c;(typename是用来定义模板参数的关键字,也能用class代替)在编译时,编译器会根据传入的实参类型生成具体类型的函数。Swap(a, b);// 编译器生成处理int类型的Swap函数Swap(x, y);// 编译器生成处理double类型的Swap函数。

2024-06-01 21:29:39 830 4

原创 C++动态内存管理:与C语言动态内存管理的差异之争

在C++中,内存管理是一个至关重要的主题。正确地管理内存可以避免内存泄漏和内存访问错误等问题,提高程序的性能和可靠性。本文将深入探讨C++中的内存管理机制,包括从C语言内存管理到C++内存管理转变,二者的关联等内容。和new/delete都是从堆上申请空间,并且需要用户手动释放。不同的地方是:1. malloc和free是函数,new和delete是操作符2. malloc申请的空间不会初始化,new可以初始化3. malloc申请空间时,需要手动计算空间大小并传递,

2024-05-10 21:41:45 929 10

原创 类与对象(下)

终于来到了我们类和对象的最后一部分,类与对象下。在这部分中,我们主要讲解类与对象的“插件” ,也就类似于拓展部分,比如友元函数,初始化列表等,让大家对C++类与对象有一个更深层次的理解。通过这三节的讲解,大家要知道,类就是对某一类实体对象来进行描述的,描述该对象具有那些属性,那些方法,描述完成后就形成了一种新的自定义类型,才用该自定义类型就可以实例化具体的对象。通过理解类与对象的概念,我们可以更好地应用面向对象的设计思想来解决实际问题,提高代码的质量和效率。

2024-05-03 16:35:34 909 9

原创 类与对象(中)

当一个类什么都不写的时候,我们通常叫它空类,那么空类中真的什么都没有吗?事实上,任何一个类在什么都没写的时候,都会生成六个默认成员函数,分别为构造函数,析构函数,拷贝构造函数,赋值重载函数,以及普通对象与const对象取地址函数。由于大多数后两个函数不需要我们手动操作,所以今天主要讲解的内容是前面四个函数。为了方便,我们会以Date类为例子,更加方便让大家理解。理解构造函数,析构函数,拷贝构造函数,赋值重载函数对理解C++雷雨对象有十分重要的作用。2.1、函数名必须要与类名一致。2.2、无返回值。

2024-04-24 00:37:53 1047 13

原创 C++:类与对象(上)

class是我们定义类所使用的关键字,使用方法跟定义结构体类似,我们可以在类的主体部分定义成员变量与成员函数。类通常有两种定义方式,第一种就是声明与定义全部放在类体中,但需要注意的是,如果函数是在类里面定义的,编译器可能默认会将函数处理成内联函数。第二种方法就是类声明放在.h头文件中,定义放在.cpp源文件上,一般来说,除非迫不得已,我们更推荐使用第二种定义方式。但需要注意的是,由于类域的限制,我们在.cpp文件中写定义的时候,要在函数名前加上类名::这一点就跟C语言模拟实现栈,队列等数据结构一样。

2024-04-19 19:51:08 804 6

原创 常见排序宝典:帮助快速上手常见基础排序算法(下)

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即显示每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是 O(nlogn) 的时间复杂度。代价是需要额外的内存空间。

2024-04-10 23:38:08 1001 9

原创 常见排序宝典:帮助快速上手常见基础排序算法(上)

希尔排序是对直接插入排序的优化当gap值>1时都是预排序,目的是为了让数组更加接近有序。当gap==1时,数组已经接近有序,这样就会很快。希尔排序的时间复杂度不好计算,并不固定。

2024-04-07 16:09:10 585 3

原创 震惊:引用与内联函数居然携手迈入c++

当涉及到优化C++代码时,内联函数和引用是两个重要的概念。内联函数可以减少函数调用的开销, 而引用可以提高代码的可读性和效率。在本文中,我们将深入探讨C++中内联函数和引用的知识点。

2024-04-05 00:15:21 280 2

原创 命名空间:组织代码的利器

在大型项目的代码分工工作中,通常会出现不同的人自己定义了相同名字的函数,参数等。就可能出现名字冲突或者命名污染等问题。为了避免这些问题的出现吗,我们就引出了“namespace”,命名空间这一概念。使用命名空间的目的是为了对标识符的的名称进行本地化,防止命名冲突,提高代码的可读性与可维护性。通过命名空间,我们可以将代码模块化,使得代码结构更清晰。在c语言中当我们定义一个全局变量rand,就会与stdlib.h库中的rand函数冲突。于是我们就在c++中引入了命名空间的概念。

2024-03-30 17:46:28 416 1

原创 走进c语言动态内存管理,拨开她的神秘面纱

总的来说,熟练的使用动态内存管理可以方便我们写出更好的,更灵活的代码,弥补函数中临时变量出了作用域就会被销毁的缺点。

2024-02-23 17:22:43 585 2

原创 c语言自定义类型:结构体的前世今生

在c语言中,结构体(struct)是一种用户自定义的数据类型,允许将不同类型的组合在一起,以便作为一个单独的数据单元来使用。结构体可以包含多个不同数据类型的成员变量,这是他们能表示更为复杂的数据结构。通俗的说,我们可以把结构体想象成一种生物,比如一种结构体就是人类,人类的性别,名字,国籍,年龄等标签,这些标签就是人类这个结构体不同类型的成员变量。人是一种结构体,那么植物,动物都可以算作是不同的结构体类型。有了结构体这种自定义的数据类型,我们才能更恰当且方便的让代码变得实用。

2024-02-22 17:20:39 1177 7

原创 c语言常见内存函数的使用与模拟实现

c语言提供了几个用于内存操作的函数,包括memcpy,memmove,memset,memcmp。这些函数可以高效且可靠的处理数据,本文将简单向大家介绍一下这些函数的使用,并简单模拟实现一下。

2023-12-27 23:43:39 896 1

原创 常见字符串函数的初步讲解(使用与简单模拟实现)

一、字符分类函数前言:在编程的过程中,我们经常要处理字符和字符串,为了方便操作字符和字符串,C语言标准库中提供了一系列库函数,现在接下来就简单讲解一下下面的字符串函数一、字符分类函数在C语言中,有一些常用的字符分类函数可以帮助我们对字符进行分类和判断。这些函数属于C标准库中的ctype.h头文件,并提供了对字符进行分类的功能。(使用以下函数时都需要包含ctype.h头文件)islower函数通过判断这里的c是否为小写字母而返回真值HeheHEHE。

2023-12-22 23:13:08 798

原创 c语言:从指针到指针数组

指针变量是为了储存内存地址的一个变量,在我们创建一个变量的时候,就会在内存中申请一块区域,这块区域就是这个变量的地址。由于这个四个地址的序号都是连着一块的,当我们知道第一个字节的地址时,就可以顺便地推出另外三个字节的地址。所以为了方便,指针指向a时,实际上指向的是a的第一个字节。我们如何去取出一个元素的地址呢?这里就要介绍一个操作符了:&,取地址操作符。这样就会打印出a所占四个字节的第一个字节的地址,比如:0x006FFD70,我们一般使用一个指针变量来接收 ,

2023-12-18 11:34:38 946

原创 assert断言使用的必要性

这主要是为了防止野指针的危害,我们都知道,野指针具有极大危害性,为了让程序安全的运行下去,我们就需要再对指针的引用与结束时使用assert判断该指针是否已经变成了野指针。另外,assert也可以用在其他判断方面,在我们运行一个极其复杂的代码时,其中一些重要数据就需要通过assert来判断是否符合预期的值,方便程序成功的运行下去。,程序就会去验证p是否等于NULL,如果确实不等于NULL,程序就会继续运⾏,否则就会终⽌运行,并且给出报错信息提示。,用于在运行时确保程序符合指定条件,如果不符合,就报。

2023-11-22 19:04:21 64 1

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

我们先看一下bubble_sort这个函数的代码,由于qsort函数可以比较任意类型的大小,但bubble_sort的if条件语句中,条件语句的判断靠的是整形计算大小,那我们应该怎么修改这个条件语句,让任意类型的数据都能通过大小比较进入语句呢?qsort函数最重要的一个参数, int (*compar)(const void*,const void*)),是一个函数指针,指向一个函数,这个函数是我们使用者自己提供的,用来比较这个目标数组中两个元素大小。这样一来,我们模拟的bbs函数就差不多成功了。

2023-11-21 01:15:11 48 1

原创 扫雷游戏的简单设计

定义两个数组,一个是mine,一个是show。当我们进入游戏后,首先应该是先有一个让玩家扫雷的棋盘,我们便把一开始的二维数组放在game函数里定义,为了方便后续调整,我们可以在game.h中用#define 定义ROW行为9,COL列为9,这样就可以通过对#define ROW 9的调整,省略后续一连片的值的修改。因为经典的扫雷是一个二维平面模型,我们便自然而然的联用到用二维数组来表示我们的扫雷盘,如果要在9*9的棋盘上布置雷的信息和排查雷,我们⾸先想到的就是创建⼀个9*9的数组来存放信息。

2023-11-01 02:10:27 67

原创 C语言的分支循环语句

c语言的有分支结构与循环结构我们可以使⽤ if 、 switch 实现分⽀结构,使⽤ for 、 while 、 do while 实现循环结构。

2023-10-25 18:54:02 54 3

原创 逻辑操作符

逻辑运算符提供逻辑判断功能,⽤于构建更复杂的表达式,主要以下三个运算符:!:逻辑取反运算符(改变单个表达式的真假)&& :与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)|| :或运算符,就是或者的意思(两侧⾄少有⼀个表达式为真,则为真,否则为假)

2023-10-18 18:33:46 108 1

原创 利用ASCII码表来打印字符

我们知道在计算机中所有的数据都是以⼆进制的形式存储的,那这些字符在内存中分别以什么样的⼆进制存储的呢?如果我们每个⼈⾃⼰给这些字符中的每个字符编⼀个⼆进制序列,这个叫做编码,为了⽅便⼤家相互通信,不造成混乱,后来美国国家标准学会(ANSI)出台了⼀个标准ASCII编码,C语⾔中的字符就遵循了ASCII编码的⽅式。我们可以在键盘上可以敲出各种字符,如:a,q,@,#等,这些符号都被称为字符。C语⾔中字符是⽤单引号括起来的,如:'a','b','@'。另外,\ddd与\xdd两种转义字符也可以表达字符。

2023-10-17 01:16:31 1615

原创 关系表达式的返回值

我们可以看见,4>3>2应该是正确的才对,但是关系运算符是从左往右依次计算,4>3为真,返回1,于是接下来的运算就是1>2,显然错误,所以最后返回0,条件语句不执行。当a>b>c时,程序优先运行a>b,为真返回1,为假返回0,再将1或者0拿去跟c比较。我们熟知当if括号中不为0时,if条件语句才会被执行。hehe并没有被打印,所以此时括号里返回了0,为假。可以看到,这里的if条件语句是真,所以执行了。例如,2>1返回1,2

2023-10-15 17:30:13 166

空空如也

空空如也

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

TA关注的人

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