自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C++静态库与动态库

库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:静态库(.a、.lib)和动态库(.so、.dll)。所谓静态、动态是指链接。

2023-07-03 11:19:05 944

原创 宏定义与内联函数的区别与联系

内联函数一般用于函数体的代码比较简单的函数,不能包含复杂的控制语句,while、switch,并且内联函数本身不能直接调用自身。1. 内联函数和普通函数的参数传递机制相同,但是编译器会在每处调用内联函数的地方将内联函数内容展开,这样既避免了函数调用的开销又没有宏机制的缺陷。的时候进行代码插入,编译器会在每处调用内联函数的地方直接把内联函数的内容展开,这样可以省去函数的调用的开销,提高效率;内联函数不需要寻址,当执行到内联函数的时候,将此函数展开,如果程序中有N次调用了内联函数则会有N次展开函数代码。

2023-06-07 22:50:55 788

原创 C++中不能重载为友元函数的四个运算符

当类中没有定义赋值运算符重载成员函数时,当程序执行到某一赋值语句时,程序会调用系统默认生成的赋值运算符重载函数。而当类中有定义赋值运算符重载成员函数,执行赋值语句时,程序就只会去调用相应的赋值运算符重载函数。2、但是在全局里,我们已经重载了参数类型为此类类型的赋值运算符函数,而这赋值语句刚好和这函数匹配上了,根据C++的规则,也会去调用这函数。然而,当我们把->运算符重载为类A的友元函数时,程序就会出现跟把赋值运算符重载友元一样的情况,即产生矛盾性。那么为什么赋值运算符不可以重载为类的友元函数?

2023-05-24 16:37:44 1435

原创 Linux-基础IO(续)

在files_struct数组当中,找到当前没有被使用的最小的一个下标,作为新的文件描述符结果:输出3结果:关闭0输出0,关闭2输出2那我们就可以发现文件描述符的分配规则就是:下图就是close(0),后,再使用open打开一个文件时文件描述符的分配规则。

2023-05-21 21:28:01 355

原创 Linux-inode和block概述

文件是存储在硬盘上的,硬盘的最小存储单位叫做扇区sector,每个扇区存储512字节。操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个块block。这种由多个扇区组成的块,是文件存取的最小单位。块的大小,最常见的是4KB,即连续八个sector组成一个block。文件数据存储在块中,那么还必须找到一个地方存储文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种存储文件元信息的区域就叫做inode,中文译名为索引节点,也叫i节点。

2023-05-21 10:42:56 612

原创 Linux中文件描述符fd和文件指针filp的理解

对于ext2文件系统来说,在磁盘存储布局上也有inode和超级块的概念,所以很容易和VFS中的概念建立对应关系。而流(如: fopen)返回的是一个FILE结构指针, FILE结构是包含有文件描述符的,FILE结构函数可以看作是对fd直接操作的系统调用的封装, 它的优点是带有I/O缓存。文件描述符的操作(如: open)返回的是一个文件描述符,内核会在每个进程空间中维护一个文件描述符表, 所有打开的文件都将通过此表中的文件描述符来引用;结构体,这个结构体的成员都是函数指针,指向实现各种文件操作的内核函数。

2023-05-21 10:23:13 935

原创 Linux-基础IO

操作文件,除了上述C接口(当然C++也有接口,其他语言也有),还可以使用系统接口open接口:参数解释:pathname: 要打开或创建的目标文件flags: 打开文件时,可以传入多个参数选项,用下面的一个或者多个常量进行“或”运算,构成flagsmode_t:如果没有对应文件需要进行创建的话,就需要指定创建文件的八进制访问权限值参数选项含义O_RDONLY以只读的方式打开文件O_WRNOLY以只写的方式打开文件O_APPEND以追加的方式打开文件O_RDWR。

2023-05-17 16:27:54 487

原创 Linux-权限的理解

目录的可执行权限是表示你可否在目录下执行命令如果目录没有-x权限,则无法对目录执行任何命令,甚至无法cd 进入目, 即使目录仍然有-r 读权限(这个地方很容易犯错,认为有读权限就可以进入目录读取目录下的文件)如果目录具有-x权限,但没有-r权限,则用户可以执行命令,可以cd进入目录,但由于没有目录的读权限,无法读文件,即使可以执行ls命令,但仍然没有权限读出目录下的文档。

2023-05-17 16:09:12 386

原创 Linux-进程控制

当一个进程调用fork之后,父子进程共享同一份代码,也就是说整个代码父子进程都可以看到,但是此时父子进程的执行位置都是相同的,也就是说fork返回后子进程也是往fork之后的代码执行(并非再从头执行)在linux中fork函数从已存在进程中创建一个新进程(子进程),而原进程为父进程。将父进程部分数据结构内容拷贝至子进程(例如PCB进程控制块,进程地址空间,页表等)fork成功后对子进程返回0,对父进程返回子进程id,fork出错返回-1。添加子进程到系统进程列表当中,当fork返回后开始调度器调度进程。

2023-05-14 21:06:33 320

原创 Linux-进程地址空间

如图所示各分区说明。

2023-03-24 22:24:59 452

原创 Linux-进程概念讲解

CPU在跑一个进程时,没有跑完就开始切换其他进程,为了下次继续跑完这个进程,会保留这个进程的上下文数据,当这个进程回来时,会把上下文数据移动到CPU内部继续执行。在调用fork函数之前,只有一个进程(父进程),当这个进程调用fork函数之后,fork函数会复制一个进程(子进程),区别是PID不同,它们的关系是父子关系。为了弄明白正在运行的进程是什么意思,我们需要知道进程的不同状态。需要强调一点的是,进程的nice值不是进程的优先级,他们不是一个概念,但是进程nice值会影响到进程的优先级变化。

2023-02-20 17:51:11 444

原创 Linux-make/Makefile

3、如果mytest文件不存在,或是mytest所依赖的后面的mytest.o文件的文件修改时间要比mytest这个文件新,那么,他就会执行后面所定义的命令来生成mytest这个文件。5、当然,你的C文件和H文件是存在的啦,于是make会生成 mytest.o 文件,然后再用mytest.o 文件声明make的终极任务,也就是执行文件mytest了。7、在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。

2023-02-03 11:30:07 953

原创 C++哈希unordered_map和unordered_set

1. unordered_map是存储键值对的关联式容器,其允许通过keys快速的索引到与其对应的value。2. 在unordered_map中,键值通常用于惟一地标识元素,而映射值是一个对象,其内容与此键关联。键和映射值的类型可能不同。3. 在内部,unordered_map没有对按照任何特定的顺序排序, 为了能在常数范围内找到key所对应的value,unordered_map将相同哈希值的键值对放在相同的桶中。

2022-10-31 15:14:37 1928

原创 C++ 基于红黑树的map和set

/ 节点的颜色// 红黑树节点的定义{{}// 节点的左孩子// 节点的右孩子// 节点的双亲(红黑树需要旋转,为了实现简单给出该字段)// 节点的值域// 节点的颜色};

2022-10-18 19:52:26 783

原创 C++AVL树

AVL树四种旋转的详细图解

2022-10-18 17:17:56 206

原创 C++map和set

1、set是按照一定次序存储元素的容器2、在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。3、在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。4、set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代。5、set在底层是用二叉搜索树(红黑树)实现的。

2022-09-18 19:54:22 144

原创 C++二叉树进阶——二叉搜索树

cur没有孩子结点一样可以使用上面的情况,因为无论是cur->left还是cur->right都是空,直接赋值给parent的左结点或者是右结点。找到要删除的结点5之后,接下来开始寻找右子树中最左边的结点,结点6(这个最左边的结点是一定没有左子树的)。a.要删除结点最多只有一个子结点(要么没有子结点,要么只有左子结点或右子结点)如图所示,结点6和结点8分别是,没有子结点和只有一个子结点的情况。要把替换之后的结点5删掉,需要找到结点5的父结点,也就是结点7。以结点5为例,要想删除结点5,用其他的结点来替换。.

2022-08-31 16:14:42 671

原创 C++多态

多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。那么在继承中要1、必须通过基类的指针或者引用调用虚函数2、被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写在虚函数的后面写上 =0 ,则这个函数为纯虚函数。包含纯虚函数的类叫做抽象类(也叫接类),抽象类不能实例化出对象。派生类继承后也不能实例化出对象,只有重写纯虚函数,派生类才能实例化出对象。...

2022-08-26 11:18:39 181

原创 C++中的继承

继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。{public:{}protected:// 姓名// 年龄};// 继承后父类的Person的成员(成员函数+成员变量)都会变成子类的一部分。这里体现出了Student和。

2022-08-21 21:49:16 286

原创 C++ stack和queue

1、stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。2、stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。3、stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下操作:empty:判空操作back:获取尾部元素操作push_back:尾部插入元素操作。...

2022-08-18 16:03:14 321

原创 C++优先级队列

1、优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。2、此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)。3、优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的顶部。4、底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。...

2022-08-17 14:19:16 4600 2

原创 C++ list讲解

C++STL中list的讲解

2022-05-17 16:17:35 595

原创 C++vector讲解

这篇文章分为两个部分讲解,一部分是,vector的使用;另一部分是,vector的模拟实现。

2022-04-29 16:28:46 3595

原创 模拟实现string类

模拟实现string,包含增删查改等功能。mystring.h#pragma once#define _CRT_SECURE_NO_WARNINGS#include <iostream>#include <assert.h>#include <string.h>using std::ostream;using std::istream;namespace bit{ class string { friend ostream&

2022-04-12 15:56:43 328

原创 C++类和对象

1、初始C++一、面向过程和面向对象初步认识C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成二、类的引入与定义在C语言中,结构体只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数struct Student{ void SetStudentInfo(const char* name, const char* gender, int age) {

2022-03-21 16:04:51 64

原创 C++入门基础总结(Extern C和范围for)

一、命名空间在C/C++中,变量、函数以及类都是大量存在的,这些变量、函数和类的名称也都是存在于全局作用域当中,这会导致我们在写代码的时候,会对这些名称起冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染命名空间定义定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。在这个命名空间之中,可以定义函数、变量也可以嵌套另外一个命名空间。要是一个项目工程之中,存在多个相同名称的命名空间,编译器最后会合成

2022-03-08 15:00:42 616

原创 二叉树链式结构的实现

目录一、前置说明二、二叉树的遍历2.1、前序、中序以及后序遍历2.2、层序遍历一、前置说明在学习二叉树的基本操作前,需先要创建一棵二叉树,然后才能学习其相关的基本操作。由于现在大家对二叉树结构掌握还不够深入,为了降低大家学习成本,此处手动快速创建一棵简单的二叉树,快速进入二叉树操作学习,等二叉树结构了解的差不多时,我们反过头再来研究二叉树真正的创建方式。typedef int BTDataType;typedef struct BinaryTreeNode{ ...

2021-12-12 12:12:02 948 3

原创 二叉树的顺序结构

一、二叉树的顺序结构及实现1.1 二叉树的顺序结构普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段。1.2 堆的概念及结构1、每个节点都大于其子节点的二叉树结构叫做大堆,也叫大根堆2、每个节点都小于其子节点的二叉树结构叫做小堆,也叫小根堆1.3 堆的实现

2021-12-11 18:38:12 1395

原创 数据结构——数和二叉树的概念和结构

1、数的概念及结构

2021-12-10 21:30:15 1038

原创 数据结构之栈和队列

之前讲解了顺序表、单向无头链表、双向无头链表。现在我们介绍一种新的数据结构,栈和队列。它们存储数据的方式是在我们之前学习的数组和链表的基础之上的。

2021-11-09 21:37:10 289

原创 数据结构之双向链表

目录链表的分类链表的实现test.cslist.cslist.h链表的分类实际中链表的结构非常多样,以下情况组合起来就有8种链表结构:1. 单向或者双向2. 带头或者不带头3. 循环或者非循环虽然有这么多的链表的结构,但是我们实际中最常用还是两种结构:无头单向非循环链表带头双向循环链表1、无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构,如哈希桶、图的邻接表等等。另外这种结构在笔...

2021-11-06 19:11:57 106 1

原创 数据结构之单链表

和通讯录的增删查改很相似,这次主要以熟悉单链表的编写为目的。包含的功能有:头插、头删、尾删、尾插、单链表的查找、指定位置的插入、

2021-11-02 17:28:19 327 2

原创 数据结构之顺序表

目录什么是线性表?顺序表静态顺序表动态顺序表text.cSeqlist.hSeqlist.c什么是线性表?线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结 构,常见的线性表:顺序表、链表、栈、队列、字符串...线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物 理上存储时,通常以数组和链式结构的形式存储。今天我们主要介绍顺序表。顺序表..

2021-11-01 15:34:16 385 7

原创 C语言——程序的编译(预处理)与链接

一 代码的编译程序要运行起来,必须要经过四个步骤:预处理、编译、汇编和链接。接下来通过几个简单的例子来详细讲解一下这些过程。对于链接,是先将所有.c文件编译,最后汇总链接组成一个程序的每个源文件通过编译过程分别转换成目标代码(object code)。每个目标文件由链接器(linker)捆绑在一起,形成一个单一而完整的可执行程序。链接器同时也会引入标准C函数库中任何被该程序所用到的函数,而且它可以搜索程序员个 人的程序库,将其需要的函数也链接到程序中。1.1 预处理.

2021-10-09 20:59:20 913

原创 C语言——文件的操作与处理

目录一 文件与流1.1 为什么要使用文件1.2什么是文件?1.2.1 程序文件1.2.2 数据文件2.1C语言中的流2.1.1什么是流?2.1.2 标准流二 文件的打开和关闭1.1文件指针1.2 文件的打开与关闭1.3 文件的读写1.3.1 字符输入输出函数1.3.2 文本行输入输出函数1.3.3 格式化输入输出函数1.3.4 二进制输入输出函数1.3.5文件随机读写函数三 文件结束判断与缓冲一 文件与流1.1 为...

2021-10-08 17:01:32 546 1

原创 C语言——动态内存函数

目录动态内存函数1、为什么需要开辟动态内存?2、动态内存函数2.1 malloc2.2 free2.3 calloc2.4 realloc3、常见的动态内存错误3.1、对NULL指针的解引用操作3.2、对动态开辟空间的越界访问3.3对非动态开辟内存使用free释放3.4使用free释放一块动态开辟内存的一部分3.5对同一块动态内存多次释放3.6动态开辟内存忘记释放(内存泄漏)4、有关动态内存的经典笔试题题目1题目2题目3...

2021-10-07 19:50:28 1206 1

原创 C语言——自定义类型(结构体,枚举,联合体,位段)

结构体结构体的定义结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量struct tag//标签{ member-list;//成员列表}variable-list;//变量列表//注意变量列表后面的分号//结构体struct Stu{ char name[20];//姓名 char sex[5];//性别 char id[20];//学号 int age;//年龄 double grade;//成绩}student;//这里的stu

2021-10-05 16:10:39 805 1

原创 C语言——字符串函数和内存函数

一、字符串函数strcat - 字符串链接 - 字符串追加

2021-09-22 15:03:18 159

原创 指针的进阶——数组

2021-09-10 16:14:35 177 8

原创 模拟实现qsort函数

之前学习过冒泡排序法——排序整形的数组。对于其他类型的数组,虽然可以使用冒泡排序法,但是需要对之前的代码进行调整,例如字符数组、结构体数组、指针数组等等。那么有没有这样一种函数可以自动排序各种类型的数组呢?有的。在C语言的库函数中,函数qsort就有这样的功能,本博客将讲解qsort函数是如何使用的,并自己编写一个函数来模拟qsort函数。...

2021-09-09 18:39:11 148 10

空空如也

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

TA关注的人

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