自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

凯凯在此

讨论问题欢迎私信我,看到会回复的,走过路过不要忘了给个关注

  • 博客(102)
  • 收藏
  • 关注

原创 计算机基础知识总结

文章目录1. Linux常用基本命令1. Linux常用基本命令文件管理:命令功能touch创建文件mkdir创建目录rm删除文件 / 目录vim文件编辑cat文件查看cp复制mv移动file查看文件类型wc文件容量pwd当前位置cd切换到指定目录下ls显示指定目录下的内容用户管理:命令| 功能id 查id...

2021-10-28 21:57:01 1247

原创 C++项目:TinyHTTP服务器

文章目录1. HTTP协议报文1.1 请求报文1.2 响应报文2. httpd代码1. HTTP协议报文1.1 请求报文请求端(客户端)的HTTP报文1.2 响应报文响应端(服务端)的HTTP报文2. httpd代码写一个服务器#include <iostream>#include <sys/types.h>#include <sys/socket.h>#include <unistd.h>#include <arpa/ine

2021-10-28 21:55:47 501

原创 Linux网络编程:I/O复用

文章目录1. IO多路复用2. 分类2.1 Select模式2.2 Poll模式2.3 Epool模式线程过多会占用很多的资源:在空间方面,线程是有内存开销的,1000个线程就要512M或2G内存;在时间方面,线程切换是有CPU开销的,大量线程会让时间花在上下文切换。1. IO多路复用IO多路复用: 多个网络连接复用一个IO线程使用一个线程来检查I/O流(Socket)的就绪状态。通过记录跟踪每个I/O流(Socket)的状态,来同时管理多个I/O流 。多个Socket复用功能是在内核驱

2021-10-28 21:53:49 209

原创 C++练习2:动态规划问题

问题汇总剑指 Offer 10- II. 青蛙跳台阶问题剑指 Offer 63. 股票的最大利润剑指 Offer 42. 连续子数组的最大和剑指 Offer 47. 礼物的最大价值剑指 Offer 10- II. 青蛙跳台阶问题题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。解题:class Solution {public:

2021-09-06 14:00:31 315 1

原创 高级数据结构及算法练习2:树的搜索与回溯算法

题目汇总剑指 Offer 26. 树的子结构剑指 Offer 27. 二叉树的镜像剑指 Offer 28. 对称的二叉树剑指 Offer 26. 树的子结构题目:输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)B是A的子结构, 即 A中有出现和B相同的结构和节点值。例如:给定的树 A: 3 / \ 4 5 / \ 1 2给定的树 B: 4 / 1返回 true,因为 B 与 A

2021-09-01 18:45:45 76

原创 C++练习1:活用vector、string和map

题目汇总力扣meituan-001. 小美的用户名力扣meituan-001. 小美的用户名几个常用的宏定义:isalpha() 用来判断一个字符是否为字母,如果是字符则返回非零,否则返回零isalnum() 用来判断一个字符是否为数字或者字母,也就是说判断一个字符是否属于a~z||A~Z||0~9isdigit() 用来判断一个字符是否为数字islower() 用来判断一个字符是否为小写字母,也就是是否属于a~zisupper() 和 islower 相反,用来判断一个字符是否为大写字母

2021-08-31 10:20:57 198

原创 基础数据结构及算法练习3:栈与队列

题目汇总力扣剑指 Offer 09. 用两个栈实现队列力扣剑指 Offer 09. 用两个栈实现队列题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )解题:初始化两个栈:把两个栈的数据全部出栈清空;添加数据:栈1的入口如同队列的尾部在栈1中直接入栈删除数据:栈2的出口如同队列的头部如果栈2有数据,就直接输出栈2

2021-08-26 15:21:15 79

原创 Linux网络编程:Socket编程网络模型

文章目录1. OSI七层模型2. 总结3. TCP/IP四层模型1. OSI七层模型No.模型功能1物理层比特流传输2数据链路层网络控制、链路纠错3网络层寻址,路由4传输层建立主机端到端的连接5会话层建立、维护和管理会话6表示层格式转化,加密解密7应用层提供应用程序间通信常见物理层协议:模型e.g.串口/COM口RS-232(仪表接口,智能仪表);RS-485(联网仪表接口)并行/L

2021-08-23 11:10:30 173

原创 Linux网络编程:Socket编程接口(3)UDP下的网络编程

文章目录

2021-08-22 22:00:55 143

原创 Linux网络编程:Socket编程接口(2)TCP下的网络编程

文章目录3. 完成TCP网络编程3.1 完善3.2 属性3.3 多个客户端的和单个服务器通信3.4 代码格式化工具astyle3. 完成TCP网络编程三次挥手的阶段:四次挥手的阶段:3.1 完善从终端输入 ip 地址和端口号,使用 int argc 和 char* argv[]需要多条信息的发送和接收,使用无限循环为了不受输入堵塞的影响,让客户端和服务器之间多发消息,收发信息用各自的进程客户端开一个进程,让父进程写子进程读服务器也开一个进程,让父进程读子进程写(或者用线程 threa

2021-08-18 16:58:55 166

原创 Linux网络编程:Socket编程接口(1)TCP下的socket操作

文章目录1. 接口1.1 转换操作1.1.1 字节序转换操作1.1.2 IP地址转换操作1.1.3 主机名转换操作1. 接口1.1 转换操作转换操作主要分为三类:字节序转换操作、IP地址转换操作和主机名转换操作1.1.1 字节序转换操作网络序转主机序函数含义作用ntohs()network to host short把unsigned short类型从网络序转换到主机序ntohl()network to host long把unsigned long类型从网络

2021-08-18 10:34:27 328

原创 Linux网络编程:Socket编程概念

文章目录1. 套接字1.1 协议域 domain1.2 类型 type1.3 协议 protocol1.4 网络连接的5个要素2. 协议2.1 TCP (Transmission Control Protocol)三次握手/四次挥手数据传送问题2.2 UDP (User Datagram Protocol)3. 路径3.1 IP3.2 端口4. 字节序1. 套接字socket 是一个编程接口socket 是一种特殊的文件描述符1.1 协议域 domain参数含义AF_INET

2021-08-16 20:35:46 882 1

原创 Linux系统编程:左右值引用、万能引用、完美转发

文章目录1. 左值引用、右值引用2. 移动构造函数、移动赋值运算符重载2.1 不可拷贝对象的移动2.2 可拷贝对象的移动1. 左值引用、右值引用右值: 只能在 = 右边使用的值字面量、中间结果、临时对象/匿名对象无法取地址,不能使用左值引用左值: 可以在 = 左边使用的值编程,观察现象:#include <iostream>using namespace std;void Print(int n){ cout << n << endl;

2021-08-16 10:48:05 111

原创 Linux系统编程:线程池编程

文章目录1. 构成1.1 任务队列 `job_queue`1.2 工作线程 `worker`1.3 线程池 `thread_pool`2. 流程3. 实例 为什么使用线程池? 频繁创建和销毁线程浪费CPU资源 线程是什么? 一堆线程放在一个池子里统一管理1. 构成类似于银行柜台的流程1.1 任务队列 job_queue作用: 存放待处理的任务成员:构成接口处理函数void *(*)(void*)参数void *arg队列指

2021-08-15 16:54:17 245 2

原创 Linux系统编程:多线程同步

文章内容1. 信号量2. 互斥量1. 信号量为了使总进程和子线程两者之间可以有序的打印,对上一篇文章末尾的程序添加信号量用同一个数p,主进程p从3开始递增5次,线程p从3开始递减10次#include <pthread.h>#include <unistd.h>#include <iostream>#include <semaphore.h>using namespace std;sem_t sem; // 全局变量vo

2021-08-14 20:12:24 139

原创 Linux系统编程:多线程编程

文章目录1. 什么是线程2. 操作2.1 线程的并发2.2 共用变量2.3 线程合并1. 什么是线程线程是比进程更小的能独立运行的基本单位,线程基本上不拥有系统资源一个进程下可以开多个线程,这些线程是并发的查看线程命令命令含义ps -T -p -T开启线程查看top -H -p -H开启线程查看文件书写文件含义/proc/{PID}/task/线程默认的名字和进程名相同/proc/{PID}/task/{tid}/comm线程名

2021-08-13 21:47:46 101

原创 Linux系统编程:IPC信号量

文章内容1. 信号量2. 函数创建信号量信号量:用于解决数据竞争,如同火车道上的信号灯,用来管理共享火车道(共享内存)1. 信号量分类:分类取值e.g.二值信号量0 和 1指示锁计数信号量0 和 n停车场电子牌操作:PV 测试和增加查看: man sem_overview接口头文件: semaphore.h库: pthread2. 函数操作函数创建sem_t *sem_open(const char *name, i

2021-08-13 15:28:17 152

原创 Linux系统编程:IPC共享内存

文章内容1. POSIX 共享内存2. 函数2.1 创建内存映射1. POSIX 共享内存查看:共享内存一般生成在 ls /dev/shmls /dev/ 看到绿色的文件都是用来通信的接口:头文件: sys/mman.h库: librt.so2. 函数操作函数创建int shm_open(const char *name, int oflag, mode_t mode)删除int shm_unlink(const char *name)建立内存映射v

2021-08-12 20:55:32 188

原创 Linux系统编程:IPC消息队列

文章内容1. POSIX 消息队列2. 函数2.1 创建消息队列2.2 写入消息队列2.3 读取消息队列2.4 获取队列信息1. POSIX 消息队列查看:POSIX消息队列预览 man mq_overview消息队列一般生成在 ls /dev/mqueue接口:头文件: mqueue.h库: librt.so(real time)结构体:struct mq_attr 消息队列属性成员含义说明mq_flags标志在mq_open时被初始化,在mq_seta

2021-08-11 21:13:33 163

原创 Linux系统编程:管道

文章内容1. 管道简介2. 匿名管道2.1 单工管道1. 管道简介匿名管道:一般用于父子进程FIFO管道/命名管道:一般用于两个独立的进程通过命令的方式实现管道:发送文件:send.cpp#include<iostream>using namespace std;int main(int argc,char* argv[]){ for(int i=1;i<argc;++i){ cout << argv[i] &l

2021-08-11 11:03:34 487

原创 高级数据结构及算法练习1:树的遍历

题目汇总力扣429:N叉树的层序遍历力扣429:N叉树的层序遍历题目:给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)树的序列化输入是用层序遍历,每组子节点都由 null 值分隔。(参见示例)解题:使用迭代的方式遍历:/*// Definition for a Node.class Node {public: int val; vector<Node*> children; Node() {} Node(int _val

2021-08-04 11:21:53 104 1

原创 高级数据结构及算法:红黑树

文章目录红黑树1. 特点2. 操作2.1 旋转2.2 反色操作2.3 插入往一个2-node节点底部插入新的节点往一个3-node节点底部插入新的节点红黑树1. 特点《算法》中对红黑树的定义(针对的是线的颜色):红色的线永远是左侧链接。(强行的规定)没有一个节点同时链了两条红色的线。(也就是没有4-node)任何从根到叶子节点的路径上有相同颜色的黑线。(黑线节点完美平衡)红黑树合并为2-3查找树:右侧有红色的线,要先通过旋转变为左侧的线,再合并:合并的过程实质上是把红色的线拉成平的

2021-08-03 21:58:50 98

原创 高级数据结构及算法:2-3查找树

文章目录2-3查找树1. 特点2. 操作2.1 查找2.2 插入完美平衡(Perfect balance):每条从根节点到叶节点的路径的高度都是一样的(Every path from root to leaf has same length)。也就是每个节点的平衡因子为02-3查找树1. 特点依然满足BST树的特点,即左边的小,右边的大2-3查找树允许出现3节点名称key个数子节点个数2节点(2-node)12(二叉)3节点(3-node)23(三叉)左

2021-08-02 16:04:28 98

原创 高级数据结构及算法:AVL树(平衡二叉树)

文章目录AVL树(平衡二叉树)1. 操作1.1 旋转AVL树(平衡二叉树)BST树的缺点是 可能不平衡AVL树是一种满足平衡条件的的BST树AVL树(平衡二叉树):它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。即每个节点的左右子树的高度差绝对值是1或0平衡因子BF(Balance Factor):左树深度减去右树深度的值。平衡因子BF = 左子树深度-右子树深度。平衡二叉树每个结点的平衡因子只能是1,0,-1。若其绝对值超过1,则该二叉排序树就是不平

2021-08-01 17:09:25 190

原创 高级数据结构及算法:BST树(二叉查找树)

文章目录二叉查找树1. 特点2. 操作2.1 查找2.2 添加2.3 删除二叉查找树二叉查找树(Binary Search Tree),又被称为二叉搜索树二叉查找树演示连接1. 特点任意节点的左子树不空, 则左子树上所有节点的key均小于它的根节点的key任意节点的右子树不空, 则右子树上所有节点的key均大于它的根节点的key任意节点的左,右子树也分别为二叉查找树没有key相等的节点2. 操作2.1 查找2.2 添加2.3 删除...

2021-07-31 13:44:39 131

原创 高级数据结构及算法:树的遍历

文章目录1. 多叉树遍历1.1 深度优先遍历先序遍历后序遍历1.2 广度优先遍历2. 二叉树遍历2.1 深度优先遍历先序遍历后序遍历中序遍历1. 多叉树遍历图形演示1.1 深度优先遍历深度优先遍历:从根节点开始先沿着树的一个枝遍历到叶子节点,再遍历其他的枝。深度优先遍历又分为先序遍历和后序遍历先序遍历上图树的先序遍历结果:A → B → D → G → H → I → C → E → J → F递归深度优先遍历:先序遍历以 力扣589题:叉树的前序遍历 为例/*// Definitio

2021-07-28 17:08:24 353

原创 高级数据结构及算法:树的基本概念,树的表示方法

文章目录树的基本概念1. 什么是树?2. 树的构成2.1 节点2.2 度2.3 层次2.4 深度与高度3. 树的分类4. 特殊的树树的表示方法1. 多叉树表示法1.1 双亲表示法1.2 孩子表示法1.3 优化:双亲孩子表示法1.4 孩子兄弟表示法2. 二叉树表示法2.1 顺序存储方式2.2 链式存储方式树的基本概念1. 什么是树?树(Tree)是n(n>=0)个结点的有限集。n=0时称为空树。在任意一棵非空树中:有且仅有一个特定的称为根(root)的结点当n>1时,其余结点可分为m(

2021-07-28 16:47:01 546

原创 Linux系统编程:进程基础

文章内容程序与进程虚拟存储器/虚拟地址空间gdb调试功能进程状态常用命令程序与进程进程:运行中的程序虚拟存储器/虚拟地址空间gdb调试功能步骤操作意义1g++ test.cpp -g编译时加 -g2gdb ./a.out开始调试3list查看断点4b 5断点加在第5行5info proc mapping查看内存区域的映射6nnext走到下一步7p handle查看handle的地址8q退出进程状

2021-07-18 16:29:06 241 1

原创 C++进阶:智能指针,写时拷贝技术

文章目录1. 智能指针 auto_ptr1.1 auto_ptr的原理1.2 内存检测工具的使用1.3 数组指针的释放1.4 赋值操作的问题2. 智能指针 unique_ptr3. 智能指针 scoped_ptr4. 智能指针 shared_ptr4.1 shared_ptr的原理4.2 数组指针的释放5. 智能指针 weak_ptr指针的危害指针未初始化野指针内存泄漏1. 智能指针 auto_ptr1.1 auto_ptr的原理作用:对作用域内的动态分配对象的自动释放#inclu

2021-07-12 18:53:51 1296 4

原创 C++进阶:Boost的使用

文章目录boost的安装boost的使用1. lamdba表达式2. 容器中存放任意类型值3. 数据类型转换4. 指针容器5. 退出处理6. 遍历7. 函数绑定8. 不可复制类boost的安装在线安装Redhat/Centos : sudo yum install boost-develUbuntu : sudo apt-get install libboost-dev手动安装大部分boost库的头文件主要由模板和内联函数实现,不需要编译成二进制文件。只需要解压即可。下载boos

2021-07-12 14:51:54 2992

原创 C++进阶:Makefile基础用法

文章目录1. Makefile基本语法与执行2. Makefile简化过程3. Makefile生成并使用库3.1 动态库的建立与使用3.2 动态加载库的建立与使用1. Makefile基本语法与执行作用:Makefile 文件告诉 Make 怎样编译和连接成一个程序可用命令 dnf install make 安装make功能格式:按如下格式编写 Makefile目标(target): 依赖(prerequiries)... 命令(command)注意:每个命令行前面必须是一个T

2021-07-09 22:54:07 2545 5

原创 C++进阶:动态库与静态库——类篇

文章目录0. 先创建几个文件1. 静态库的制作与使用2. 共享库(动态库)3. 动态加载库静态库和动态库的创建和使用和上一篇文章(函数篇)相似,详细内容可以在那里看0. 先创建几个文件simple.h 文件内容:#include <iostream>#include "simple.h"using namespace std;Simple::Simple(){ cout << "Simple()" << endl;}Simple::~Simple(){

2021-07-09 19:37:35 603

原创 C++进阶:动态库与静态库——函数篇

文章目录函数篇0. 先创建几个文件1. 静态库的制作与使用2. 共享库3. 动态加载库不论是 gcc 还是 g++ 都会把 .c 或者 .cpp 文件转换成 .o 文件此时,函数都会在 .o 文件里,我们就需要把 .o 文件连接在一起但当 .cpp 文件非常多时,命令就会非常长,为了避免这种情况,我们把功能类似的 .o 文件打包在一起分类作用后缀静态库一个或多个.o目标文件归档在一个文件中.a共享库没有main函数的可执行文件.so动态加载库没有main函

2021-07-09 12:00:12 527 2

原创 C++进阶:重载原理分析

文章目录1. 认识重载2. 命名反倾轧3. 禁用命名倾轧4. 编译过程5. 空类1. 认识重载C++函数重载底层实现原理是C++利用name mangling(倾轧)技术,来改名函数名,区分参数不同的同名函数C++编译器通过函数名和其参数类型识别重载函数我们通过 nm ./overload 查看编译情况int add(int a,int b){ return a+b;}float add(float a,float b){ return a+b;}int

2021-07-08 15:36:48 225

原创 C++进阶:xxx_cast 类型转换

文章目录1. static_cast2. const_cast3. dynamic_cast4. reinterpret_cast4. 理解内存在C语言中,基本数据类型之间的直接转换不会报错,指针类型之间的转换需要加强转#include <stdio.h>int main(){ int n = 10; long l = n; float f = n; char c = 'a'; n = c ;

2021-07-07 17:41:13 238 3

原创 STL:STL迭代器

文章目录1. 迭代器分类2. 迭代器操作3. 迭代器适配器3.1 插入适配器3.2 流迭代器适配器3.3 逆向迭代器适配器1. 迭代器分类类别(Category)举例输入迭代器(Input Iterator)istream输出迭代器(Output Iterator)ostream前向迭代器(Forward Iterator)forward_list、unordered_set、unordered_multiset、unordered_map、unordered_mu

2021-07-06 10:08:47 113

原创 STL:STL算法总结

文章目录1. 头文件2. 常用算法2.1 填充2.2 遍历2.3 最大最小3. 排序算法3.1 排序3.2 反转3.3 随机4. 查找算法4.1 统计4.2 查找4.3 搜索4.4 边界5. 删除和替换算法5.1 复制5.2 移除5.3 替换5.4 去重5.5 交换6. 算术算法7. 关系算法8. 集合算法9. 排列组合算法9.1 排列组合9.2 堆算法1. 头文件头文件功能<algorithm>算法函数<numeric>数值算法<fun

2021-06-30 22:33:03 148

原创 STL:仿函数

文章目录1. 仿函数的基本用法2. 用于数组排序算法foreach各种算法使用仿函数的优化:拉么大函数迭代器1. 迭代器分类2. 迭代器操作迭代器适配器(不考)1. 仿函数的基本用法对于仿函数的使用需要:创建一个类,类中要对 ( ) 运算符重载创建函数,调用 ( ) 运算符重载,实现仿函数的使用fang.cpp#include <iostream>using namespace std;void Func(int n){ cout << "Hel

2021-06-30 22:28:47 346 2

原创 STL:STL容器适配器 stack 和 queue

文章目录STL容器适配器 stack 和 queue1. 基本用法2. 相关练习2.1 力扣2322.2 力扣235STL容器适配器 stack 和 queue栈容器(stack): 后进先出(LIFO)队列容器(queue): 先进后出(FIFO)1. 基本用法对数组逐个入栈,并出栈输出对数组逐个放入队列,并出队列输出#include <iostream>#include <stack>#include <queue>using namespace

2021-06-29 15:18:22 143

原创 STL:关联容器 map

STL关联容器 set映射容器(map):一对多映射,基于关键字快速查找,不允许重复值map 的特点:每次放入两个数据 <key,value>,key 有序且不重复1. 操作1.1 初始化和查找初始化map词典并访问#include <iostream>#include <map>using namespace std;int main(){ // 映射dict目录/词典 map<string,string>

2021-06-28 22:19:48 169 1

空空如也

空空如也

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

TA关注的人

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