自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 SPDK软件栈基础概念

这些对象可以是任意大小的二进制数据,可以包含多种类型的元数据(例如创建时间、修改时间、拥有者等),并可以通过网络协议(如HTTP、S3)进行访问。而 SPDK 是一个软件库,其中的控制器(Controller)和命名空间(Namespace)都是由软件接口实现的,可以在任意支持 SPDK 的硬件平台上运行。与vhost-blk target不同的是,vhost-nvme target提供了更高的性能和更低的延迟,适用于需要超高性能的应用场景,例如人工智能、大数据分析等。

2023-04-21 13:40:08 951

原创 嵌入式系统--存储器

一个嵌入式系统必须有一定的存储器来存放和执行代码。

2022-10-11 09:40:39 490

原创 简单的UDP网络程序

udpServer.cc#include "udpServer.hpp"void Usage(std::string proc){ std::cout << "Usage: " << proc << " port" <<std::endl;}//./udpServer ip portint main(int argc, char *argv[]){ if(argc != 2){ Usage(argv[0]);

2021-07-10 21:16:11 281 3

原创 剑指 Offer 32 - III. 从上到下打印二叉树 III

题目请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。例如:给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回其层次遍历结果:[ [3], [20,9], [15,7]]思路:1栈1队列,k是每一层的标识数在奇数层,进行正常的层序遍历进入队列的同时,并入栈 。如:队列[1,2] 栈

2021-06-21 11:25:59 114

原创 Leetcode--692-前K个高频单词

题目给一非空的单词列表,返回前 k 个出现次数最多的单词。返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率,按字母顺序排序。示例 1:输入: ["i", "love", "leetcode", "i", "love", "coding"], k = 2输出: ["i", "love"]解析: "i" 和 "love" 为出现次数最多的两个单词,均为2次。 注意,按字母顺序 "i" 在 "love" 之前。思路:map联合vector。map中的key是唯

2021-06-08 17:38:45 97

原创 LeetCode(106、144、94)二叉树前序、中序、后序遍历的非递归写法

前序class Solution {public: vector<int> preorderTraversal(TreeNode* root) { vector<int> v; stack<TreeNode*> st; TreeNode* cur = root; while(!st.empty()||cur) { while(cu

2021-06-06 20:16:13 82

原创 LeetCode--剑指 Offer 30包含min函数的栈

class MinStack {public: /** initialize your data structure here. */ stack<int> m_data; stack<int> m_min; MinStack() {} //思路:两个栈,一个正常压数据,一个只压最小数据 //m_min每次压数据时候都要判断是否比当前栈顶数据小 //如果小直接压,如果大,将自身的栈顶数据再压一次 void push(i

2021-05-26 23:04:59 52

原创 Leetcode--剑指offer09--用两个栈实现队列

题目用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )class CQueue {public: stack<int>stack1; stack<int>stack2; CQueue() {} //尾部插入使用一个栈 void appendTail(int value)

2021-05-26 23:03:01 54

原创 leetcode--剑指offer-28,对称的二叉树

请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。1/ 2 2/ \ / 3 4 4 3输出 : true思路:迭代的思想使用迭代思想做题最重要的是,确定迭代结束的条件。包括迭代成功结束的条件和迭代到一半失败结束的条件!此题中,我们从左右两子树父节点开始迭代,迭代条件有三个! if(left == nullptr && right == nullptr

2021-05-10 17:43:48 60

原创 Leetcode---236. 二叉树的最近公共祖先

题目:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”示例 1:输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1输出:3解释:节点 5 和节点 1 的最近公共祖先是节点 3 。思路:递归的思想,递归的结束条件是root == p || roo

2021-05-07 10:59:37 114

原创 C++ list 模拟实现

#pragma oncenamespace dk{/////////////////////////////////////节点类 template <class T> struct __list_node//struct默认访问权限是共有的 { T _data; __list_node<T>* _next; __list_node<T>* _prev; __list_node(const T& x = T()) :_data

2021-04-23 18:25:06 101 1

原创 C++vector模拟实现

vector.h#pragma once#include<assert.h>#include<iostream>namespace dk{ template<class T> class vector { public: //迭代器 typedef T* iterator; typedef const T* const_iterator; iterator begin() { return _start; } i

2021-04-23 18:20:41 88

原创 Linux 进程间通信--共享内存深度解析

system V共享内存共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据。进行多个进程间通信共享内存函数shmget函数功能:用来创建共享内存原型:int shmget(key_t key, size_t size, int shmflg);参数key:这个共享内存段名字size:共享内存大小shmflg:由九个权限标志构成,它们的用法和创建文件时使用的mode模式标

2021-04-22 21:04:43 94

原创 Linux进程间通信---管道-----深度解析

文章目录站在文件描述符的角度来理解管道匿名管道管道读写规则匿名管道特点命名管道匿名管道与命名管道的区别用命名管道实现server&client通信要让两个进程实现通信,必须先让这两个进程看到同一份资源。站在文件描述符的角度来理解管道匿名管道#include <unistd.h>功能:创建一无名管道原型int pipe(int fd[2]);参数fd:文件描述符数组,其中fd[0]表示读端, fd[1]表示写端返回值:成功返回0,失败返回错误代码管道读写规则

2021-04-22 17:03:28 120

原创 Linux 文件系统,inode + 软硬链接

文件系统我们使用ls -l的时候看到的除了看到文件名,还看到了文件元数据[root@localhost linux]# ls -l总用量 12-rwxr-xr-x. 1 root root 7438 "9月 13 14:56" a.out-rw-r--r--. 1 root root 654 "9月 13 14:56" test.c每行包含7列: 模式、 硬链接数、 文件所有者、 组、 大小、 最后修改时间 文件 = 属性 + 内容inode{ 属性集合 } block{

2021-04-21 22:04:07 78

原创 深入理解C++ 中深浅拷贝+string类+实现一个string类+string类的现代写法

深浅拷贝浅拷贝浅拷贝:也称位拷贝,编译器只是将对象中的值拷贝过来。如果对象中管理资源,最后就会导致多个对象共享同一份资源,当一个对象销毁时就会将该资源释放掉,而此时另一些对象不知道该资源已经被释放,以为还有效,所以 当继续对资源进项操作时,就会发生发生了访问违规。要解决浅拷贝问题,C++中引入了深拷贝。说明:上述string类没有显式定义其拷贝构造函数与赋值运算符重载,此时编译器会合成默认的,当用s1构造s2时,编译器会调用默认的拷贝构造。最终导致的问题是,s1、s2共用同一块内存空间,在释放时同一

2021-04-18 16:48:47 154

原创 深度解析Linux中系统文件IO+文件描述符+输出重定向+缓冲区

系统文件IO采用系统接口来进行文件访问接口介绍#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: 打开文件时,可以传入多个参数选项,用下

2021-04-17 17:04:15 202

原创 Linux 进程程序替换 + minishell实现

fork函数在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。#include <unistd.h>pid_t fork(void);//返回值:自进程中返回0,父进程返回子进程id,出错返回-1进程调用fork,当控制转移到内核中的fork代码后,内核做:分配新的内存块和内核数据结构给子进程将父进程部分数据结构内容拷贝至子进程添加子进程到系统进程列表当中fork返回,开始调度器调度当一个进程调用fork之后,

2021-04-05 19:03:51 113

原创 Leetcode--字符串相加 C++实现

题目: 415. 字符串相加题目描述:给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。思路:使用数值相加减的思路,从后向前按位相加设置一个进位next相加后的每一位进行尾插最后对字符串进行逆置,得到结果class Solution {public: string addStrings(string num1, string num2) { string ret;//定义一个string类 int end1 = num1.s

2021-04-05 19:02:25 290

原创 Linux fork函数深度解析(写时拷贝+进程终止(exit)+进程等待(wait,waitpid))

文章目录fork函数fork返回值写时拷贝进程终止进程退出场景进程常见退出方法_exit函数exit函数进程等待wait 方法waitpid方法**参数:**获取子进程status总结fork函数在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。#include <unistd.h>pid_t fork(void);//返回值:自进程中返回0,父进程返回子进程id,出错返回-1进程调用fork,当控制转移到内核中的fork

2021-03-31 20:50:55 523

原创 C/C++内存管理

int globalVar = 1;static int staticGlobalVar = 1;void Test(){static int staticVar = 1;int localVar = 1;int num1[10] = {1, 2, 3, 4};char char2[] = "abcd";char* pChar3 = "abcd";int* ptr1 = (int*)malloc(sizeof (int)*4);int* ptr2 = (int*)calloc(4, si

2021-03-24 16:15:47 63

原创 Linux 进程(fork 、僵尸进程,孤儿进程)系统调用和库函数的概念

文章目录1.进程1.1描述进程-PCB1.2 task_struct-PCB的一种1.3task_ struct内容分类1.4查看进程1.5通过系统调用获取进程标识符1.6通过系统调用创建进程-fork初识1、如何理解进程创建?2、fork为什么会有两个返回值?如何深刻的理解呢?3、fork父子执行顺序和代码和数据复制的问题-初识2.进程状态2.1Z(zombie)-僵尸进程2.1.1僵尸进程危害:2.2孤儿进程补充用户态和内核态系统调用和库函数概念1.进程课本概念:程序的一个执行实例,正在执行的程序等

2021-03-24 16:01:57 149

原创 C++ 初始化列表+static成员+友元函数+友元类

1. 初始化列表初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。class Time{public: Time(int hour)//这里的构造函数不能被调用 //1.因为没有传参,需要调用的是无参的构造函数 //2.因为没有传参,如果Time(int hour = 1),有默认值,就可调用 :_hour(hour) { cout << "Time(int hour)" << endl

2021-03-23 20:55:02 169

原创 函数的返回值使用传引用返回还是传值返回

最近学习到运算符重载,关于函数使用传引用返回还是传值返回的理解一直有些模糊,决定在此小总结一下!引用的概念:引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。引用的特性:int main(){ int a = 10; int &b = a;//b是a的别名,通过ab都可以修改a的值 a = 20; b = 30; int &c = a;//1.可以有多个别名 int &d = b; //

2021-03-23 20:53:00 612 3

原创 Linux 进程地址空间详解

进程地址空间是内存吗?先来两段代码感受一下!#include <stdio.h>#include <unistd.h>#include <stdlib.h>int g_val = 0;int main(){ pid_t id = fork(); if(id < 0) { perror("fork"); return 0; } else if(id == 0) { //child printf("child[%d]: %d : %

2021-03-20 22:47:24 192

原创 Linux进程优先级and环境变量概念及用法详解

基本概念cpu资源分配的先后顺序,就是指进程的优先权(priority)。优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能。查看系统进程在Linux系统中,用ps-l命令会类似输出以下几个内容:我们很容易注意到其中的几个重要信息,有下:UID : 代表执行者的身份PID : 代表这个进程的代号PPID :代表这个进程是由哪个进程发展衍生而

2021-03-19 17:18:05 159

原创 Linux中复制其他目录中的文件到当前目录

复制整个目录下的文件首先可以看到整体目录如下所示步骤:进入 lesson目录输入指令cp ../126_lesson/* ./ -rf指令ll查看文件就可以看到126_lesson 目录下的所有文件都复制过来了./ //表示当前目录../ // 表示上级目录126_lesson/* //文件路径复制其他目录中的一个文件到当前目录目标:将126_lesson下的test.txt文件复制到lesson中步骤:进入lesson目录中//

2021-03-18 16:36:43 5569 1

原创 C++之日期类的实现之 默认成员函数和运算符重载的综合应用(+、-、=、<、>、+=、-=)

在完成日期类时,涉及到对应月份天数的限制,先构造出下面的函数,用以判断当月天数。//获取某一月的天数int Date::GetMonthDay(int year, int month){ static int daysArray[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; int days = daysArray[month]; if (month == 2 && ((year % 4 == 0 &am

2021-03-11 18:17:22 93

原创 类和对象中 构造函数+析构函数+拷贝构造函数+操作符重载

文章目录1. 类的6个默认成员函数2. 构造函数构造函数特征3. 析构函数析构函数特征4. 拷贝构造函数拷贝构造函数特征5. 赋值操作符重载运算符重载赋值运算符重载1. 类的6个默认成员函数如果一个类中什么成员都没有,简称为空类。空类中什么都没有吗?并不是的,任何一个类在我们不写的情况下,都会自动生成下面6个默认成员函数.2. 构造函数构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,保证每个数据成员都有 一个合适的初始值,并且在对象的生命周期内只调用一次。构造函数

2021-03-11 18:05:12 215

原创 使用云服务器 Linux中git clone git push 不通的问题解决

出现错误:fatal: unable to access ‘https://github.com/dk1804/Linux.git/’: Encountered end of file原因:云服务器443端口未对外开放解决方法:以腾讯云为例第一步控制台第二步进入云服务器第三步点击安全组第四步:修改规则,添加规则第五步:自定义中找到HTTP(443)点击完成后,就可以愉快的进行 git clone 和 git push 了!...

2021-03-11 11:01:47 1043 3

原创 Linux gcc/g++使用

编译:预处理/编译/汇编/链接(1)预处理:头文件展开,去注释,宏替换,条件编译。生成(.i)文件(2)编译:将c代码翻译形成汇编代码。生成(.s)文件(3)汇编:将汇编形成目标二进制文件。生成(.o)文件(4)链接:将目标文件和系统库进行链接形成可执行程序(可执行程序)Linux指令:cat helloworld.cgcc -E helloworld.c -o helloworld.i//预处理之后的文件gcc -S helloworld.i -o helloworld.s//汇编语言g

2021-03-06 22:13:32 207

原创 类和对象入门(上)定义+实例+结构体内存对齐+this指针

1.面向过程和面向对象的初步认识C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。2.类的引入C语言中,结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。class className{// 类体:由成员函数和成员变量组成}; // 一定要注意后面的分号3.类的定义class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注

2021-03-06 17:02:01 139

原创 C++入门之--命名空间+缺省函数+函数重载+引用+内联函数

1、命名空间在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。1.1命名空间的定义定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。//1. 普通的命名空间namespace N1 // N1为命名空间的名称{ // 命名空间中的内

2021-02-26 00:31:47 139

原创 Linux 文件目录权限+重定向命令+设置粘滞位+umask命令

修改文件权限命令: chmod u-r 文件名功能:取消拥有者的读权限。命令: chmod u+r 文件名功能:增加拥有者的读权限。命令:chmod u+rw,g-w,o+r 文件名功能:拥有者加上读写权限,所属组减去写权限,other加上读权限。修改目录权限chmod u+r 目录名chmod u-r 目录名功能:目录的读权限,是否允许查看目录下的文件chmod u-w 目录名chmod u+w 目录名功能:目录的写权限,是否允许特定角色在指定目录下创建文件。chmod u

2021-02-16 00:21:08 313

原创 剑指offer--链表中倒数第k个节点

题目描述输入一个链表,输出该链表中倒数第k个结点。示例1输入1,{1,2,3,4,5}返回值{5}思路:运用快慢指针的思想,快指针先于慢指针k个节点,遍历链表,当快指针为NULL;慢指针指向第(n-k)个节点即倒数第k个节点。如下图所示:代码实现如下:struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) { struct ListNode* prev = pListHead; struct

2020-12-18 18:04:32 58 2

原创 leetcode 203 --移除链表元素--C实现

题目说明: 删除链表中等于给定值 val 的所有节点示例:输入: 1->2->6->3->4->5->6, val = 6输出: 1->2->3->4->5首先我们需要清除链表的概念(链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。)其结构图如下:思路:运用双指针解法,如下图所示,定义prev = NULL;cur= head;根据cur->val是否等于给定val进行判

2020-12-18 10:48:17 95

原创 leetcode--数组形式的整数加法 ---C实现

题目描述:对于非负整数 X 而言,X 的数组形式是每位数字按从左到右的顺序形成的数组。例如,如果 X = 1231,那么其数组形式为 [1,2,3,1]。给定非负整数 X 的数组形式 A,返回整数 X+K 的数组形式。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/add-to-array-form-of-integer示例输入:A = [1,2,0,0], K = 34输出:[1,2,3,4]解释:1200 + 34 = 1234思路

2020-12-16 15:23:41 103 1

原创 函数指针

函数指针指向函数的指针,存放函数的地址。#include"stdio.h"int Add(int x, int y);{ return x + y;}int main(){ int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8 }; int(*p)[10] = &arr;//取出数组的地址,p就是数组指针 int(*pf)(int, int) = &Add; printf("%p\n",&Add); printf("%p\n", A

2020-11-17 21:42:59 134 1

原创 动态内存管理(malloc calloc realloc)

为什么存在动态内存分配目前我们已经掌握的内存开辟方式有:int val = 20;//在栈空间上开辟四个字节char arr[10] = {0};//在栈空间上开辟10个字节的连续空间但是上述的开辟空间方式有两个特点:1.空间开辟大小是固定的。2.数组在申明的时候,必须指定数组的长度,它所需要的内存在编译时分配。但是有时候我们所需要的空间大小在程序运行的时候才能知道,此时就需要动态内存开辟。1.mallocvoid* malloc (size_t size);这个函数向内存申请一块连

2020-11-16 21:42:41 168

原创 几种常见的字符函数和字符串函数的模拟实现

strlen功能说明size_t strlen ( const char * str );字符串以 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )。参数指向的字符串必须要以 ‘\0’ 结束。strlen函数的模拟实现思路:1、函数传参传递的是字符串首元素的地址2、(*str++)遍历整个字符串元素,直到遇到 ‘\0’ 停止模拟实现strlen#include<stdio.h>#include<strin

2020-11-11 18:05:22 250

空空如也

空空如也

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

TA关注的人

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