自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 MQTT5.0新特性(比对3.1.1)

MQTT(MessageQueuingTelemetryTransport),即消息队列遥测传输协议,是一种基于发布/订阅的消息传输协议。其轻量、开放、简洁和易实现的特点能够适用于要求代码量小、网络带宽资源匮乏的情景,如机器间通信(M2M)、物联网等。...

2022-07-17 16:32:44 4378 1

原创 Linux进程概念

进程概念进程简单点来说就是正在执行的程序,从内核看就是担当分配系统资源的实体。而程序则是一段有序指令的集合,根据冯诺依曼体系结构我们可以得到,程序员的代码存储在硬盘中,当其执行的时候代码会首先被加载到内存上面。当加载到内存上面时候,就需要操作系统对其进行描述与组织,也就是管理。而操作系统则是通过一个结构体对这个指令和数据进行描述然后组织,从而达到管理的目的。进程信息被放在PCB(进程控制块)中,Linux下的PCB其实是一个task_struct结构体;task_struct中的信息包括标示符

2022-03-20 20:04:11 247

原创 C++项目:云备份

项目简介实现一个类似于云盘的功能来备份客户端的文件,服务器根据客户端的请求进行处理,并根据热点管理进行压缩存储,客户端也可以自行下载文件,且服务器端支持通过浏览器进行查看与下载以及断点续传功能。环境配置linux,VS019,高版本g++ jsoncpp httplib和bundle库的安装工具介绍使用httplib库进行http服务器的搭建,我们更关注服务器的业务处理。使用bundle库进行压缩解压缩存储使用jsoncpp库对于内存中的文件进行持久化存储到我们的磁盘中项目模

2022-03-16 17:21:00 2088 1

原创 C++类型转换

C++四种类型转换

2022-03-14 10:03:57 871

原创 C++ 智能指针

话不多说上代码!void div(){ int* p = new int; int m = 0; int n = 0; cin >> m >> n; if (n == 0) { throw exception(); } cout << "continue" << endl; cout << m / n; delete p;}int main(){ try { div(); } catch (exce

2022-03-14 08:20:45 99

原创 常见面试题(2)

1.进程间通信进程间通信有管道,共享内存,消息队列和信号量管道其实就是内存中的一块缓冲区,管道分为匿名管道和命名管道;匿名管道没有标识符,只能在具有亲属关系的进程间进行通信命名管道有标识符,可以被其它进程找到,可以用于一台主机上任意进程间通信...

2022-03-11 11:13:04 478

原创 常见的面试题(1)

1.malloc和new的区别?C++允许重载new/delete操作符,特别的,布局new的就不需要为对象分配内存,而是指定了一个地址作为内存起始区域,new在这段内存上为对象调用构造函数完成初始化工作,并返回此地址。而malloc不允许重载的。 new分配内存成功后返回一个对象的指针,而malloc返回的是一个void*,需要通过强转成特定类型的指针。 new关键字申请内存时无需指定大小(这个由编译器计算对象的大小),而malloc需要指定大小;对于申请失败时,new会抛异常(bac_alloc

2022-03-09 09:24:49 886

原创 红黑树(RHTree)的结构与操作#/

红黑树概念红黑树,是一种二叉搜索树,与一般二叉搜索树不同的是在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。性质它不仅仅具有二叉搜索树的特性,还必须满足以下特点:根结点必须是黑色 每个结点不是黑的就是红的 如果一个节点是红色的,则它的两个孩子结点是黑色的 对于每个结点,从该结点到其所有后代叶结点的简单路径上,均 包含相同数目的黑色结点 每...

2022-02-22 21:52:41 95

原创 传输层(udp和tcp协议)

Internet 的传输层有两个主要协议,互为补充。无连接的是 UDP,它除了给应用程序发送数据包功能并允许它们在所需的层次上架构自己的协议之外,几乎没有做什么特别的事情。面向连接的是是TCP该协议几乎做了所有的事情。UDP协议Internet协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol)。UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。UDP协议格式16位源端端口 16位对端端口 16

2022-02-18 10:09:57 1696

原创 应用层(HTTP协议、Cookie机制)

应用程序是我们自己写的,所以我们需要自己定制应用层的协议,它是直面我们程序员的一层自定制协议与典型知名协议自定制协议:也就是我们所说的自己根据应用程序的特点,定制的协议(数据格式);在我们的应用程序的数据传送中,一般需要对数据进行序列化和反序列化;序列化:按照指定格式将多个数据对象进行组织成为可持久化存储或者数据传输的二进制字符串反序列化:将二进制数据串根据指定格式进行解析得到多个数据对象(数据要尽可能短小,传输速度也要快)常见的序列化方式JSON(JavaScript Object

2022-02-11 20:13:21 1323

原创 socket套接字编程

常见的socket API// 创建 socket 文件描述符 (TCP/UDP, 客户端 + 服务器)int socket(int domain, int type, int protocol);// 绑定端口号 (TCP/UDP, 服务器) int bind(int socket, const struct sockaddr *address,socklen_t address_len);// 开始监听socket (TCP, 服务器)int listen(int socket...

2022-02-10 16:29:52 1575

原创 力扣1002. 查找共用字符

class Solution {public: vector<string> commonChars(vector<string>& A) { vector<string> result; if (A.size() == 0) return result; int hash[26] = {0}; // 用来统计所有字符串里字符出现的最小频率 for (int i = 0; i ...

2022-02-09 13:38:07 95

原创 Hash#/(理解,实现与应用)

unordered系列的关联式容器之所以效率比较高,是因为其底层使用了哈希结构哈希概念顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素时,必须要经 过关键码的多次比较.顺序查找时间复杂度为O(N),平衡树中为树的高度,即O(log2N),搜索的效率取决于搜索过程中元素的比较次数。 理想的搜索方法:可以不经过任何比较,一次直接从表中得到要搜索的元素。 如果构造一种存储结构,通过 某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立一一映..

2022-02-05 20:14:19 723

原创 多线程应用(线程池,单例模式)

线程池一堆线程进行任务处理,主要针对大量任务需要处理的场景,使用多执行流可以提高处理效率如果一个任务到来就创建一个线程来处理这有很大缺点:成本:总耗时=线程创建时间+任务处理时间+线程销毁时间,如果任务处理时间短,则大量时间被线程创建与销毁消耗了 风险:如果有大量线程进来,则在峰值压力下系统可能会有崩溃风险思想:线程池其实是一堆创建好的线程和一个任务队列,有任务来了就抛入线程池中,分配一个线程进行处理线程池中的线程与任务节点数量都有最大限制,避免资源消耗.实现:typedef

2022-02-03 20:59:33 551 1

原创 其他的锁#/(乐观锁,悲观锁,读写锁,自旋锁,CAS算法)

应用场景:读者—写者模型也就是读共享,写互斥的场景就比如,如果有多个线程和一个数据空间,而有的线程想要修改空间中的数据,有的只是想看一看有什么数据,这时候用互斥锁的话就只能串行进行,效率很低读锁:当前只要没有被加写锁写锁:既没有读,也没有写的时候才能加写锁实现:用两个计数器当加锁不成功时,则要阻塞进程/线程读写锁的阻塞是通过自旋锁来实现的自旋锁:一直占用cpu不释放,循环进行条件判断;适用于等待时间确定较短的场景...

2022-02-03 14:19:47 317

原创 Linux多线程理解---(线程安全(互斥锁,信号量,条件变量)#/)

线程安全概念多线程之间对同一个临界资源的访问操作是安全的,访问同一个临界资源可能会造成数据二义实现互斥:保证执行流在同一时间对临界资源的唯一访问,保证安全同步:通过一些判断实现对资源获取的合理序列操作互斥互斥锁本质:就是一个0/1的计数器,主要用于标记资源的访问状态;本身就是用来实现互斥,自己也就是一个临界资源.(同一个资源所有进程在访问的时候得加同一把锁)自身的安全---互斥锁是一个原子操作操作加锁(将状态置为不可访问状态)解锁(将状态置为可访问状态)一

2022-02-02 20:52:10 3196

原创 Linux多线程理解---(线程概念,线程控制)

线程概念:线程是进程中的一条执行流程

2022-02-01 19:27:57 1260

原创 Linux-信号(重入,volatile关键字)

信号概念:它是一种事件通知机制,通知进程发生了什么事件,打断当前进程的操作去处理这个事件种类:使用kill -l(查看linux信号种类)---62种非可靠信号/非实时信号: 1~31; 可靠信号/实时信号:34~64;信号生命周期产生产生方式:硬件中断ctrl +z(20)/c(2)/\(3)软件中断:int kill(pid_t pid,int sig)给指定进程发送指定信号int raise(int sig);给自己发送指定信号voidabort(void).

2022-01-31 16:36:28 986

原创 基础IO—(Linux下的库函数和系统调用以及重定向和动态静态库)

标准库文件IO操作FILE* fopen(char *pathname,char *mode);//打开文件pathname:文件路径名; mode:文件的打开方式mode 含义 r 只读打开文件,文件必须存在 r+ 读写打开文件,文件必须存在 w 只写打开文件,文件不存在则自动创建,存在则清空内容 w+ 读写打开文件,文件不存在则自动创建,存在则清空内容 a 追加方式打开文件,文件不存在则自动创建,存在则数据总是写入到文

2022-01-29 15:12:04 1353

原创 进程控制(创建,终止,等待,程序替换)

进程创建pid_t fork()和pid_t vfork()进程本质上就是一个PCB,创建进程就相当于创建PCB;pid_t fork(void);pid_tvfork(void)功能:通过复制父进程创建一个新的进程(子进程)返回子进程id给父进程,对于子进程返回0,失败返回-1;pid_vfork(void) 特性:父子进程共用一个虚拟地址空间,父子进程数据共享任意一个进程对原有数据的修改都会影响到另一方,并且共用同一个栈,因此函数调用压得都是同一个栈,造成栈混乱,因此让子进程先.

2022-01-27 01:37:18 887

原创 进程(Process)基础知识(孤儿,僵尸进程)

冯诺依曼体系:计算机硬件体系结构-五大硬件单元 输入,输出,运算器,存储器,控制器所有的设备都是围绕内存工作的(存储器在所有设备中完成的是数据中间缓冲作用操作系统:做管理的软件-对计算机上的软硬件资源进行管理,让计算机更加好用管理:描述+组织系统调用:操作系统提供给用户用于访问系统内核资源的接口库函数:大佬们针对典型场景功能对系统调用接口进行的封装库函数与系统调用接口的关系:上下级的调用关系.进程概念:在用户角度进程就是一个运行中的程序,但在操作系统的角度,进程是pcb-

2022-01-25 16:53:21 732

原创 二叉搜索树(BST)的概念及实现与分析

二叉搜索树概念二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值 它的左右子树也分别为二叉搜索树int ar[]={5,3,2,4,8,9,1};BST树的插入如果树为空则直接插入; 如果不为空,则按照二叉搜索树的规则插入.bool Insert(const K& key, const V& value) {

2022-01-22 20:19:24 339

原创 面向对象三大特性之多态(详解)

目录一.多态的概念协变析构函数的特殊处理二.抽象类和override和final抽象类接口继承和实现继承override和final三.多态的原理动态绑定和静态绑定单继承和多继承的虚函数表虚函数与虚继承重载,重写和重定义(隐藏)补充:一.多态的概念举例.我们在买票时会有成人票和儿童票,成人票的价格和儿童票的价格不一样,我们需要去区分成人票和儿童票,当然也有可能有其他的票型,这就很麻烦.我们就需要使用多态来处理概念:当不同对象完成同一个操..

2022-01-18 19:06:07 1260

原创 面向对象三大特性---继承

一.继承的概念继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特 性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构, 体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。格式方法:二.继承的继承方式与作用域继承和访问方式都有public,protected和private这三类.其关系如下图:总结:1.基类private成员在派生..

2022-01-11 18:03:45 295

原创 list的使用及其模拟实现

一.list iterator的使用1. begin与end为正向迭代器,对迭代器执行++操作,迭代器向后移动 2. rbegin(end)与rend(begin)为反向迭代器,对迭代器执行++操作,迭代器向前移动 int ar[] = { 1,2,3,4,5,6,7,8,9,0 }; int n = sizeof(ar) / sizeof(ar[0]); //list<int> mylist(10,5);//带头结点的双向循环链表 list<int> myli

2021-12-07 14:26:32 794

原创 模板初阶template

1.泛型编程编写与类型无关的通用代码,是代码复用的一种手段.模板是泛型编程的基础2.模板2.1函数模板概念:函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本格式:template<typename T1,typenameT2,......typename Tn>返回值类型 函数名(参数列表){}2.2类模板...

2021-12-05 18:48:49 126

原创 进程间通信(IPC)

进程间通信(IPC)操作系统为用户提供的几种用于进程间通信的方式(管道,共享内存,消息队列,信号量)目的:进程具有独立性(每个进程都有自己的虚拟地址空间,访问的都是自己的虚拟地址,其他进程在自己的虚拟地址空间映射中实际上是没有这个数据的),因此进程间无法直接通信,但是在大型项目中多个协同工作很常见,这时候进程间通信就尤为重要.进程间通信根据不同的实际应用场景来采用不同的方式.一.管道-PIPE半双工通信:管道有两端,但是数据从哪端到哪端这个由用户来定1.管道的分类1.1匿名管道内

2021-11-22 21:09:59 535

原创 网络基础(1)

目录一.网络发展背景1.交换机:2.路由器3.网络的划分4.IP地址5.端口号6.网络通信协议7.网络字节序8.传输层的TCP与UDP协议一.网络发展背景1.交换机:根据记录所连接的计算机的mac(物理网卡地址),进行数据交换.缺点:无法实现想发送给哪个主机就发送给哪个主机.2.路由器在数据交换的技术上增加了一个功能---进行网络识别,为每一条数据在网络中,选择一条合适的路径,发送到目标主机上,已经实现了想给谁发就给谁发的功能,路由器会识别这个

2021-11-10 20:13:35 1882

原创 C++基础语法

1.namespace在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染.定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员.一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中使用:(1)加命名空间名称及作用域限定符 (2)使用using将...

2021-10-22 00:01:33 65

原创 函数/类模板

1.泛型编程:编写与类型无关的通用代码,是代码复用的一种手段,模板是泛型编程的基础2.函数模板(1)概念:函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定 类型版本.(2)函数模板格式 template 返回值类型 函数名(参数列表){}//template<class T>template<typename T>void Swap(T& x1,T& x2){ T tmp = x1; x1 =.

2021-10-21 11:22:46 41

原创 内存管理---malloc/free和new/delete的区别

malloc/free和new/delete的共同点是:都是从堆上申请空间,并而需要手动释放,申请连续的空间一般是2个G,不同点是:1.malloc和free是函数,new和delete是操作符2.malloc申请的空间不会初始化,new可以初始化3.malloc申请空间时,需要手动计算空间大小并传递,new只需要在其后跟空间的类型.如果是多个对象,[]中指定对象个数即可.4.malloc返回值类型为void* ,在使用时必须强转,new不需要,因为new后面跟的是空间的类型5.mall

2021-10-21 09:11:31 4195

原创 Linux基础指令

一.目录操作1.lsls 列出该目录下的所有子目录以及文件ls -l 列出文件的详细信息ls -a 列出该目录下的所有文件,包括以. 开头的隐藏文件.ls -1 一行输出一个文件2.pwdpwd 显示该用户当前所在的目录3.cdcd 目录 返回这个目录cd ..回到上级目录cd ~ 返回根目录4.mkdirmkdir 创建目录mkdir -p创建一个多级目录5.rmdirrmdir 删除空目录redir -p 当子目录被删除父目录也成为空.

2021-09-28 18:01:49 42

原创 八大排序算法简述(初学)

排序的概念 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 它分为内部排序和外部排序.内部排序:数据元素全部放在内存中的排序。 外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。目录1.1直接插入排序1.2希尔排序1.3选择排序1.4堆排序1.5冒泡排序1.6快速排序1.7归并排序1.8基数排序1.1直接插入排序...

2021-09-20 12:23:06 115

原创 二叉树的合并C语言递归实现

给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为NULL 的节点将直接作为新二叉树的节点。示例1:输入: Tree 1 Tree 2 1 2 ...

2021-09-01 13:24:24 347

原创 堆的实现(完全二叉树)

一.堆的概念及性质:堆,也就是完全二叉树的顺序存储方式存储的数据结构.将根节点最大的堆叫最大堆或大根堆,根节点最小的堆叫最小堆或小根堆.性质:(1)堆中某个节点的值总是不大于或不小于其父节点的值 (2)堆总是一棵完全二叉树二.堆的功能实现:(1)堆的创建;(2)堆的向上及向下调整的算法;(3)堆的删除及插入;(4)取堆的堆顶元素;(5)堆的销毁;#pragma once//二叉树的顺序存储->完全二叉树;#include"Common....

2021-08-29 08:15:13 231

原创 顺序表和链表

顺序表和链表都是线性表的一种,还有队列和栈,以及字符串等等.一.顺序表顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般用数组来存储.1.顺序表的分类:\(1)静态顺序表(定长的)#define N 8typedef int ElemTypetypedef struct SeqList { ElemType arr[N];//定长数组 size_t size;//数组长度}SeqList;(2)动态顺序表(容量不够自动扩容的)typedef s

2021-08-17 18:15:26 267

原创 单链表的逆置

思路:让链表的指向反过来从而达到逆置的效果比如1->2->3->4->5=>5->4->3->2->1.cur->next=prev;让指向下一个结点的结点指向前面的空指针.然后依次向后改变结点指向的方向.struct ListNode* reverseList( ListNode* head) { ListNode* cur = head; ListNode* prev = NULL; while (cur) { .

2021-08-16 17:45:18 58

原创 数组右旋操作 以及 合并两个有序数组

1.数组右旋,k表示次数;void rotate(int* nums, int numsSize, int k) { int newArr[1024];//引进一个新数组来保存旋转后的数组 for (int i = 0; i < numsSize; ++i) { newArr[(i + k) % numsSize] = nums[i]; } for (int i = 0; i < numsSize; ++i) { nums[i] = newArr[i]; }}int

2021-08-13 23:08:10 141

原创 数组形式的整形加法.c

对于非负整数X而言,X的数组形式是每位数字按从左到右的顺序形成的数组。例如,如果X = 1231,那么其数组形式为[1,2,3,1]。K是一个非负整数,计算出X+K的值并返回这个整数的数组形式.int* addToArrayForm(int* num, int numSize, int k, int* returnSize) { int* res = malloc(sizeof(int) * fmax(10, numSize + 1));//动态申请数组空间 *returnSize = ...

2021-08-13 22:24:47 121

原创 顺序表的增删改查等操作以及动态扩容

定义一个结构体:typedef struct SeqList { ElemType* base; size_t capacity; size_t size;}SeqList;1.对数组初始化void SeqListInit(SeqList* pst, size_t capacity) { pst->capacity = capacity; pst->base = (ElemType*)malloc(sizeof(ElemType) * pst->capacit

2021-08-13 01:22:20 220

空空如也

空空如也

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

TA关注的人

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