自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 map、set的使用

概念:首先我们要知道map/set是什么?它们是STL库中的关联容器,在STL库中有八个关联容器,分别是map、set、multimap、multiset、unordered_map、unordered_set、unordered_multimap、unordered_multiset。不同体现在三个方面: 一个是set、或者是map。 允许重复key,或者不允许。 按顺序保存,或者不允许。 关联式容器是什么? 关联式容器也是用来存储数据的,与序列式容器不同

2022-05-15 18:37:38 386

原创 进程间通信——信号

信号简介概念:​ 信号时一种软件终端,提供了一种处理异步事件的方法,也是进程间通信的唯一一个异步的通信方式。Unix中定义了很多信号,有很多条件可以产生信号,对于这些信号有不同的处理方式。查看信号在Linux系统下可以通过kill -l 查看所有信号的定义。目前Linux中定义了62种信号,1-31号信号是普通信号,34—64号的信号,是实时信号。本文主要讲解普通信号,简单介绍实时信号。man 7 signal 可以查看信号在什么条件下产生默认处理动作是什么信号.

2022-05-06 16:03:27 954 5

原创 进程间通信-共享内存

共享内存共享内存的理解共享内存是System V版本的一个进程间通信方式。共享内存,顾名思义就是允许两个不相关的进程访问同一个逻辑内存,共享内存是两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常为同一段物理内存。进程可以将同一段物理内存连接到他们自己的地址空间中,所有的进程都可以访问共享内存中的地址。如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程。特别提醒:共享内存并未提供同步机制,也就是说,在第一个进程结束对共享内

2022-04-23 13:43:13 2214 5

原创 进程间通信-管道

进程间通信介绍什么是进程间通信:每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程A把数据从用户空间拷到内核缓冲区,进程B再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信。进程间通信的前提:不同的进程之间必须可以看到一份公共资源。进程间通信的目的 数据传输:一个进程需要将它的数据发送给另一个进程 资源共享:多个进程之间共享同样的资源。 通知事件:一个进程需要

2022-04-23 13:38:58 785 2

原创 动静态库--Linux

动态链接与静态链接的解释:通过命令ldd+可执行文件名,可以查看可执行文件中调用的库库文件名和引入库的名称如:libc.so-> c库,去掉前缀lib,去掉后缀.so或.a。使用动态链接生成的可执行程序体积小,依赖库,在程序运行时加载库函数,可以只有一份。使用静态链接生成的可执行程序体积较大,它是将对应的代码拷贝到可执行程序中,不依赖与库,可移植性强。动态链接与静态链接的工作原理动态链接静态链接静态库与动态库 静态库...

2022-04-16 20:05:14 1465 6

原创 搜索二叉树详解

定义搜索二叉树,也称有序二叉树,排序二叉树,是指一棵空树或者具有下列性质的二叉树:1、若任意节点的左子树不空,则左子树上的所有节点的值均小于它的根节点的值2、若任意节点的右子树不空,则右子树上的所有节点的值均大于它的根节点的值3、任意节点的左右子树也称为二叉查找树。4、没有键值相等的节点。5、搜索二叉树中序遍历为有序数组。结构代码实现template<class K>struct BSTreeNode{ BSTreeNode<K>*

2022-04-14 16:10:21 999 3

原创 C++多态详解

c++多态多态的概念概念:通俗的来说就是多种形态,具体就是去完成某个行为,当不同类型的对象去完成同一件事时,产生的动作是不一样的,结果也是不一样的。举一个现实中的例子:买票这个行为,当普通人买票时是全价;学生是半价;军人是不需要排队。多态也分为两种: 静态的多态:函数调用 动态的多态:父类指针或引用调用重写虚函数。 这里的静态是指在编译时实现多态的,而动态是在运行时完成的。多态的定义及实现构成条件多态一定是建立在继承上的,那么除了继承还要两个条件: 必须

2022-04-13 14:03:39 1241 5

原创 inode详解

inode是什么·理解inode,要从文件储存说起。文件储存在硬盘上,硬盘的最小存储单位叫做扇区。每个扇区存储512字节。操作系统读取硬盘时,不会一个个山区的读取,这样效率太低,而是一次连续读取多块扇区,这多个扇区组成了一个块。块是文件存取的最小单位。块的大小最常见的是4kb,连续8个扇区组成一个块。文件数据都存储在块中,那么我们还必须找到一个地方存储文件的属性,这种存储文具属性信息的区域叫做inode(索引节点)。inode的内容inode包含文件的属性信息有以下内容: 文件的

2022-04-10 16:14:21 6146 5

原创 基础IO--Linux

文件相关的系统调用函数open头文件:#include<sys/types.h>​ . #include<sys/stat.h>​ .#include<fcntl.h>函数原型:int open(const char* pathname,int flags);​ int open(const char *pathname,int flags,mode_t mode);参数:①pathname: 要打开或创建的目标文件 ②flags: 打

2022-04-10 16:11:17 82 1

原创 继承详解(虚继承实现原理)

继承的概念及定义概念:​ 继承机制是面向对象程序设计为了提高代码复用率的一种手段,它可以保持原类特性的基础上进行拓展,简单来说继承是类层次的复用。接下来我们来看一个简单的继承class Person{public: void Print() { cout<<"name:"<<_name<<endl; cout<<"age:"<<_age<<endl; }pr...

2022-04-01 22:18:59 1918 9

原创 模板进一步探究

非类型模板参数模板参数分类类型形参与非类型形参。类型形参:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。注意: 浮点数,类对象以及字符串是不允许作为非类型模板的。 非类型的模板参数必须在编译期就能确认结果。 模板特化有时候,编译默认函数模板或者类模板不能正确处理需要逻辑,需要针对一些情况特殊化处理,就要做模板特化。通常情况下,使用

2022-03-30 09:47:53 145 8

原创 stack与queue模拟实现

stack与queue的模拟实现容器适配器适配器是一种设计模式(设计模式是一套反复使用的、大部分人知道的代码设计经验的总结),该模式试讲一个类的接口转化为用户希望的另一个接口,虽然stack与queue中也可以存放元素,但在STL中并没有将其划分为容器,而是成为容器适配器,这是因为stack与队列只是堆其他容器进行了包装,STL中的stack和queue是使用双端队列进行封装的。双端队列概念它是一种双开口的连续空间数据结构(与队列没有关系),双开口的含义是可以再两端进行插入删除操作,且时

2022-03-29 16:01:02 1262 8

原创 进程控制详解

进程创建fork函数初始fork函数是从一个已存在的进程中创建一个新进程,原进程为父进程。 头文件:#include<unistd.h> 函数原型:pid_t fork(void); 返回值:子进程返回0,父进程返回子进程id,出错则返回-1。 进程调用fork,当控制转移到内核中的fork代码后,内核做: 分配新的内存块和内核数据结构给子进程 将父进程部分数据结构内容拷贝至子进程 添加子进程到系统进程列表中 fo

2022-03-27 10:33:45 1586 6

原创 进程的基本概念

进程的概念冯诺依曼体系结构内存是如何充当缓冲区的: 预加载:输入设备对中央处理器要进行加载数据时,中央处理器正在处理其他进程,那么输入设备会将数据预加载到内存中,等到中央处理器空闲下来的时候再把内存中的数据加载到中央处理器中。 预写入:中央处理器堆输出设备要写入数据时,输出设备正在输出其他数据,则中央处理器会将数据预写入到内存中,等到输出设备空闲时会将数据进行输出,这个过程叫做预写入。 运算器:算数、逻辑控制器:非数据性的,数据控制逻辑的关于冯诺依曼,必须强.

2022-03-15 15:25:10 1325 8

原创 进程地址空间

再讲进程的虚拟地址空间之前,我们先来了解一下程序的地址空间是什么?程序的地址空间:这是程序地址空间。而程序是一个个死的代码,所以叫做程序地址空间不合适。程序运行起来之后,才会占用内存。所以我们称为进程地址空间。来段代码感受一下这个图#include<stdio.h>#include<stdlib.h>​int g_val=100;int g_unval;​int main(int argc,char* argv[],char* env[...

2022-03-15 13:54:58 1296 6

原创 List迭代器模拟

List迭代器模拟概念: 迭代器是一种抽象的设计概念,其定义为:提供一种方法,使他能够按顺序遍历某个聚合体(容器)所包含的所有元素,但又不需要暴露该容器的内部表现方式。 迭代器是一种行为类似智能指针的对象, 而指针最常见的行为就是内 容提领和成员 访问。 因此迭代器最重要的行为就是对operator*和operator->进行重载。 STL的中心思想在于: 将数据容器和算法分开, 彼此独立设计, 最后再以一贴胶合剂( iterator) 将它们撮合在一起。STL的迭代器是

2022-03-14 14:59:45 1856 10

原创 模拟实现my_string

源码:#pragma once#include<iostream>#include<cassert>#include<string>namespace ztl{ using namespace std; class string { friend ostream& operator<<(ostream& _cout, const ztl::string& s); ..

2022-03-01 15:13:44 96 5

原创 string的简单使用

STL库中的string类 字符串是表示字符序列的类 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作单字节字符字符串的设计特性。 string类是使用char(即作为它的字符类型,使用它的默认char_traits和分配器类型(关于模板的更多信息,请参阅basic_string)。 string类是basic_string模板类的一个实例,它使用char来实例化basic_string模板类,并用char_traits和allo

2022-02-28 10:44:32 834 4

原创 C++模板初阶

模板初阶模板初阶从三个方面来进行了解:1、泛型编程2、函数模板3、类模板泛型编程要是使用函数重载来实现对不同数据类型的操作有以下几个方面的问题:1、代码复用率低,出现新的类型的话还要再针对新类型再实现一个相同功能的函数。2、代码可维护性低,一个出错,就可能导致所有函数重载出错·。因此泛型编程应运而生。定义:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。而在C++中使用模板来实现泛型编程。模板模板分为函数模板和类模板。函数模板

2022-02-19 21:02:50 272

原创 C&C++内存管理

内存分布1、主要段及其分布​ 每个程序运行起来以后,它将拥有自己独立的虚拟地址空间。这个虚拟地址空间的大小与操作系统的位数有关系。32位硬件平台的虚拟地址空间的地址可以从0~2^32-1,即0x00000000~0xFFFFFFFF,总共4GB大小。64位硬件平台的虚拟地址空间则会很大。C/C++程序在虚拟内存中的排布大概如下所示(仅仅列出了相关的主要段):如上图所示:1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

2022-02-19 20:57:00 442

原创 vim常用命令

vim 命令1.命令模式文本操作yy:复制光标所在行nyy:复制n行内容,从当前光标所在行开始dd:删除光标所在行ndd:删除n行内容,从光标所在行开始p:粘贴在光标的下一行dd->p:剪切功能np:粘贴n次u:撤销上次动作x,nx:删除光标所在文本的内容 从左->右shift+x:删除光标所在文本的内容 从右->左shift+~:切换光标所在文本的内容的大小写r:替换一个字符,光标所在的字符,支持nrshift+r:替换模式,直接对多个内容的替换

2022-02-17 23:32:47 482

原创 Linux权限理解

权限理解权限的概念Linux下有两种用户:超级用户(root)、普通用户。超级用户:在Linux下可以做任何事情、不受限制。普通用户:在Linux下做有限的事情。超级用户的命令提示符是“#”,普通用户的命令提示符是“$”。命令:su[用户名]功能:切换用户。注意:root用户切换普通用户不需要密码;​ 普通用户切换root需要密码。Linux权限管理文件访问者的分类(人)文件和文件目录的所有者:u--User文件和文件目录的所有者所在的组的用户:g--Gr

2022-02-14 15:05:16 60

原创 类与对象(下)

类与对象再谈构造函数1、构造函数赋值在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。class Date{public: Date(int year, int month, int day) { _year = year; _month = month; _day = day; }private: int _year; int _month; int _day;...

2022-01-20 20:07:39 77

原创 类与对象(中)

类与对象(中)概述六个默认成员函数​ 如果一个类中什么成员都没有,简称为空类。空类中什么都没有吗?并不是的,任何一个类在我们不写的情况下,都会自动生成下面6个默认成员函数。构造函数概念构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时编译器会自动调用,用来初始化类的成员变量,每个对象在生命周期内只会调用一次。​ 构造函数是完成对象的初始化的,与Init函数做相同的工作,但是Init函数需要自主调用,而构造函数不用,避免了忘记调用Init函数而造成对象随机值的情况。

2022-01-19 13:34:11 62

原创 C++入门

C++关键字C++总计63个关键字,C++兼容C语言大多数特性关键字在这块不做详细解释仅做了解命名空间命名空间定义为什么存在:解决C语言中的命名冲突的问题(C语言没有办法很好的解决这个问题)1、我们自己定义的变量,函数可能与库里面重名冲突2、做一些大型项目,多人协作的话,可能会有相同的命名。命名空间的概念:在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,

2022-01-15 10:53:31 71

原创 C++类与对象1

1、面向过程与面向对象初步认识 C语言是面向过程的,关注的是过程,分析求解问题的步骤,通过函数逐步解决问题。 C++是基于面向对象的,关注的是对象,将一件事情拆分为不同的对象,靠对象之间的交互完成 因为C++兼容C所以C++是面向过程和面向对象混编的类引入:在C语言中没有类这个概念,主要是结构体(struct)而在C++中引入了类这个概念,而类是结构体拓展而来的,在C中结构体只能定义变量,而在C++中不仅可以定义变量还可以定义函数。关键字:class(推荐使用)、struct

2022-01-15 10:45:33 58

原创 队列的实现(C语言)

队列的实现队列是一种先进先出(First in First Out)的线性表,简称FIFO。与栈不同,栈是一种后进先出(先进后出)的线性表。在队列中,允许插入的一端称为队尾,允许删除的一端称为队头。假设队列是q=(a1,a2,…,an),那么a1就是队头元素,而an是队尾元素。这样我们就可以删除时,总是从a1开始,而插入时,列在最后。这也比较符合我们通常生活中的习惯,排在第一个的优先出列,最后来的当然在队伍的最后。队列分为顺序队列和循环队列。顺序队列我们可以利用数组或者链表实现。这里,我们选择用链表实现

2021-11-01 14:57:13 210

原创 栈的实现(C语言)

栈的实现首先我们思考一个问题,什么是栈?栈是数据结构的一种,栈在我们日常编码中遇到的非常多,很多人对栈的接触可能仅仅局限在 递归使用的是栈 和 StackOverflowException,栈是一种后进先出的数据结构(可以想象生化金字塔的牢房和生化角斗场的狗洞)。栈的定义栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为

2021-10-29 23:40:01 172

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

我们用一个简单的求和函数来探索函数的调用过程#include<stdio.h>#include <stdlib.h> int Add(int x, int y){ int z = 0; z = x + y; return z;}int main(){ int a = 10; int b = 20; int sum = Add(a, b); printf("sum=%d\n", sum); system

2021-08-09 19:45:14 70

原创 浮点型数据在内存中的存储

引例:#include<stdio.h>int main(){ int n=9; float *pFlote=(float *)&n; printf(“n的值为:%d\n",n); printf("*pFloat的值为:%f\n",*pFloat); *pFloat=9.0; printf("n的值为:%d\n",n); printf("*pFloat的值为:%f\n",*pFloat); return

2021-08-09 19:34:49 90

原创 扫雷小游戏(C语言实现)

扫雷相信很多小伙伴小时候都玩过吧,今天我们来试试用C语言实现简单的扫雷小游戏吧。首先我们给出一个游戏一个大致的实现方向:void Menu();游戏菜单void Game();//游戏框架int GetRandIndex(int start, int end);//随机生成雷的下标void SetMines(char mineboard[][COL], int row, int col);//埋雷数组char ShowBoard(char mineboard[][COL], int ro.

2021-07-28 17:17:01 71

原创 三子棋游戏(C语言实现)

三子棋是我们小时候经常玩的游戏,今天就分享一下如何用c语言简单实现三子棋吧编译软件VS2019c语言实现三子棋运用到了二维数组的知识,在编写三子棋程序时用到了多文件编译(不是必须的,但是使用多文件编译会增加代码的可读性),首先我们先建立一个头文件和两个源文件·:test.c//主程序 函数实现game.c//主要用于自定义函数的定义game.h//声明自定义函数主要代码实现test.c调用各个功能的函数#define _CRT_SECURE_NO_WARNINGS 1#

2021-07-27 20:05:37 60

空空如也

空空如也

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

TA关注的人

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