- 博客(69)
- 收藏
- 关注
原创 [Vscode-SSH连接报错] -- 过程试图写入的管道不存在
博主重装了下vscode以后,发现ssh远程连接Linux报错。PS:这个很重要,尝试其他解决方法的前提是都要把这个进行配置一下。3.在这里面输入config的绝对路径。配置好以后,就可以愉快的连接啦!2.选择设置指定自定义配置文件。1.打开ssh的配置文件。
2024-10-27 14:57:13 327 1
原创 兔子生崽问题
第五个月: 1对初始兔子(成熟)+1对兔子(3月成熟兔子)+1对兔子(4月新兔子成熟)+1对新兔子(初始兔子生)+1对新兔子(3月成熟兔子生) 5对。第六个月: 1对初始兔子(成熟)+1对兔子(3月成熟兔)+1对兔子(4月成熟兔)+2对兔子(5月未成熟)+3对新兔子(初始兔子生,3月成熟兔生,4月成熟兔生) 8对。第四个月: 1对初始兔子(成熟)+1对兔子(3月新兔子成熟)+1对新兔子(初始兔子生) 3对。
2024-09-03 11:05:55 313
原创 C++之deque
双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度为O(1),与vector比较,头插效率高,不需要搬移元素;与list比较,空间利用率比较高。
2024-02-23 22:55:35 1006
原创 C++之stack与queue的模拟实现
stack的文档介绍翻译:1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。2. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶被压入和弹出。3. stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下操作:empty:判空操作back。
2024-02-23 22:03:03 1022
原创 extern “C“
C++程序调用C的库,在C++程序中加extern "C"。在C++项目里,告诉C++编译器,extern C{}里面的函数是C编译器编译的,链接的时候用C的函数名规则去找,就可以链接上。C程序调用C++的库。在C++库中加extern "C"。在C++静态库,extern C告诉编译器以下函数按照C的函数名修饰规则去处理。
2024-01-25 16:34:51 1128
原创 函数栈帧的创建与销毁
越高级的编译器,越不容易观察函数栈帧的创建与销毁。且不同编译器下是略有差异的。寄存器:eax,ebx,ecx,edx,ebp,esp;要理解函数栈帧,必须理解esp和ebp这两个寄存器,esp和ebp这两个寄存器中存放的是地址,这两个地址是用来维护函数栈帧的。每一个函数调用,都要在栈区上创建一块空间。假设程序开始调用main函数,main函数这块空间就由esp和ebp进行维护。准确来说正在调用哪个函数,我这个esp和ebp维护的就是哪块空间的函数栈帧。
2024-01-14 18:17:26 1004
原创 C++入门之vector的模拟实现
vector源代码的大致框架,vector本质就是一个模板类vector的成员变量不再是我们熟悉的size,capacity,而是变成了功能一致的三个指针namespace pxl{ template<class T> class vector { public: typedef T* iterator; private: iterator _start; iterator _finish; iterator _endofstora.
2023-03-26 19:39:07 1211
原创 C++入门之vector
vector的介绍及使用首先要包头文件#include<vector>vector底层就是一个动态的顺序表构造函数vector<char>能替代string吗?答:不能,1. 因为字符串后面有 '\0' 2.string有些特殊的接口比如+=,比较大小等接口尾插push_back()vector的遍历[ ]的遍历int main(){ vector<int> v; v.push_back(1); v.push_back
2023-03-26 16:15:02 547
原创 自主设计Reactor服务器
epoll可以帮我们去检测哪些fd上的哪些事件就绪了,现在根据这仅有的54行代码,我们可以推测出将epoll设计成一个叫做就绪事件派发逻辑,说白了就是epoll可以告诉我们哪些fd就绪,哪些fd就绪了,我们就可以调用fd上的读写回调,所以我们最终就可以在epoll中进行事件派发,事件派发的时候,我们此时就可以通过epoll检测到哪些fd上的哪些事件就绪了,然后直接调用fd上的回调函数,就叫做把任务派发出去了,所以我们基于epoll写的这个事件派发的函数就可以称之为派发器。然后就开始事件派发。
2023-03-25 19:58:32 1351
原创 Linux之高级IO
所以当我们创建epoll的时候,就相当于帮助我们维护三个东西,红黑树,就绪队列,回调机制(当数据已经就绪,外设会向CPU的针脚发送中断,CPU执行中断向量表,然后执行中断上下文把数据从外设拷贝到内核,当然这个中断方法也有讲究,老式的计算机是由CPU参与IO的,CPU要把数据从外设搬到内存里,新的计算机也有独立的芯片,比计算机的等级低一点,我们称为DMA,当外设就绪之后,告诉CPU,CPU就让DMA把数据从外设搬到内存里)
2023-03-25 11:32:49 2167
原创 Linux之多线程
挂起失败就是函数调用失败,你就不能把自己放到等待队列里,继续向后走。条件可能并没有满足,但是我这个线程被唤醒了。比如很多线程在条件变量下等,等的时候 (在多CPU的情况下被唤醒),虽然大家会排队,但是在多CPU下执行代码的时候,有可能向目标条件变量发送条件就绪这样的指令,最后可能导致当前的线程被伪唤醒。再比如:我们现在的代码是只要别人生产一条数据,就把消费者唤醒了。
2023-03-25 07:36:24 2177
原创 Linux之进程信号
因为信号的产生是异步的,它在任何时候都可能产生信号,在信号产生期间,我的进程可能一直都在运行,当前进程可能会在做着更重要的事情。所以我们会将信号做延时处理,这个取决于OS和进程。因为信号是被保存在进程的PCB中,pending位图里,所谓的处理一定要进行检测,递达(默认,忽略,自定义)。当进程从内核态返回到用户态的时候,进行上面的检测并且处理工作。用户态:就是用户代码和数据被访问或者执行的时候,所处的状态。我们自己写的代码全部都是在用户态执行的。
2023-03-22 19:59:13 1313
原创 Linux之进程间通信
共享内存在内核中申请的基本单位是页,这个页叫做内存页,这个内存页叫做4KB。如果我申请4097个字节,内核会向上取整,给你4096byte*2(多要了一个就得多申请一页,因为没有4097)。但是我们实际看到的并不是4096*2,而是4097,这又是怎么回事呢?如果我向OS要了10个字节,OS只给了9个,我就认为是错的,因为很容易发生越界,OS就有问题。
2023-03-22 10:56:35 3918 1
原创 Linux之基础IO
小复习以下如果学习文件操作只停留在语言方面,是很难对文件有一个比较深刻的理解的。C程序默认会打开三个输入输出流,stdin,stdout,stderr
2023-03-21 20:28:17 2343
原创 Linux之进程概念
冯诺依曼操作系统1.0输入设备:键盘,磁盘,网卡,显卡,话筒,摄像头等2.0输出设备:显示器,磁盘,网卡,显卡,音响等输入和输出设备不是独立的两套设备3.0存储器(内存)不同的存储介质存储效率是不一样的。凡是离cpu越近的存储设备,它的效率越高,但是单价成本越高。反之4.0运算器和控制器(合称中央处理器也就是cpu)所谓的cpu也就是芯片:具有运算能力运算器:算术运算和逻辑运算控制器:读取指令,分析指令,执行指令,响应某种中断信号,执行某种中断方法。....
2023-03-17 11:08:39 1342
原创 网易C++实习一面
让你写一个发送的函数,send(void* data ,size_t len),如何把系统调用write封装成成应用层send?传空指针不报错,空指针只要不去解引用是不会报错的。1. p虽然是空指针,但是p调用成员函数不会编译错误,因为空指针不是语法错误,编译器检查不出来。2.p虽然是空指针,但是p调用成员函数不会出现空指针访问。像printf这样的函数,自己本身不修改数据,但是其他人会修改数据,需要加锁吗?编译是检查不出来空指针的问题的,空指针不是语法错误,空指针是运行时的错误。说下C++11新特性。
2023-03-16 18:19:11 4176 4
原创 网络协议中各层的传输单位
MAC 层的传输单位是帧(frame),IP 层的传输单位是包(packet),TCP 层的传输单位是段(segment),HTTP 的传输单位则是消息或报文(message)。
2023-03-06 18:09:48 6456 1
原创 网络基础(二)之HTTP与HTTPS
所以我们要把这种结构化的数据,转化成某种长字符串的信息,传递给对方,对方在根据这里的长字符串,以此定义一个message对象,然后将数据由一个字符串转化成一个结构化的数据。其中我们把从结构化数据转换成长字符串的过程我们就叫做序列化的过程。当我们把长字符串转化上来的时候 ,新的结构体里面就会有各种信息,这些信息我们再由我们的分析算法,把字符串里面的内容在一个个的分析出来,然后填入到结构体当中,在形成一个新的结构化的数据,这个过程我们称之为反序列化的过程。
2023-03-05 19:12:47 3463
原创 网络基础(二)之TCP/UDP协议
我们之前UDP/TCP 套接字,端口号一直是uint_t 16 ,因为这是协议规定的。3次握手,我们并不担心第1次丢,第2次丢,我们担心的是第3次丢,因为,第一次它有应答,第二次它也有应答,第三次它没有应答,最后一次没有应答就有可能有丢失的风险。不要认为3次握手就必须成功。三次握手指的是以较大概率建立连接的过程。我们注意到,建立连续的线都是斜着向下画的,以证明报文除了从左(右)向右(左)迁移之外,从上到下也在进行时间的流逝。
2023-03-05 19:12:16 3492
原创 网络编程套接字
为了更方便地开发网络应用程序,美国伯克利大学在UNIX上推出了一种应用程序访问通信协议的操作系统调用接字(Socket)。Socket的出现,使得程序员可以很方便地访问 TCPIP,从而开发各种网络应用程序。后来套接字被引进到 Windows等操作系统,成为开发网络应用程序的有效工具。套接字存在于通信区域,通信区域也被称为地址族,主要用于将通过套接字通信的进程的公有特性综合在一起。套接字通常只与同一区域的套接字交换数据。
2023-03-05 19:10:18 1930
原创 网络基础(三)
其实就是把报文切成了多片。1.所有的用户对应的信息是在家用路由器当中以局域网的形式接入网络的。2.每个路由器都有自己的LAN口(子网ip)和自己的WAN口。3.路由器是可以构建子网的。4.当运营商把基础设施构建好后,互联网公司要接入,就可以直接把自己的若干台机器接入到公网之中,背靠的也是自己内部的机房,只有少量机器是可以入公网的。将来你的客户请求都是要通过这些基础设施转发的。
2023-03-05 19:04:25 3099
原创 C++11
左值是一个表示数据的表达式(如变量名或解引用的指针),我们可以获取它的地址+可以对它赋值左值可以出现赋值符号的左边,右值不能出现在赋值符号左边。定义时const修饰符后的左值,不能给他赋值,但是可以取它的地址。左值引用就是给左值的引用,给左值取别名。综合而言,左值就是可以取地址的对象。这个b也认定成左值,它很特殊,因为一般的左值都是可以取地址和赋值的,这个b只能取地址不能赋值。右值也是一个表示数据的表达式,如:字面常量、表达式返回值,传值返回函数的返回值(这个不能是左值引用返回)等等,
2023-03-05 19:03:49 2672 1
原创 C++之智能指针
内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。
2023-03-05 19:02:52 3078
原创 C++之空间配置器
空间配置器,顾名思义就是为各个容器高效的管理空间(空间的申请与回收)的,在默默地工作。虽然在常规使用STL时,可能用不到它,但站在学习研究的角度,学习它的实现原理对我们有很大的帮助。一块大的内存,vector申请了100字节,list申请了48字节,string申请了8字节,剩下的内存也都分配出去了。过来一会图中蓝色区域的内存都还回来了(容器释放内存),现在有124字节的内存,但是我们要申请一个大于100字节的内存,会申请不出来。
2023-03-05 19:01:41 908
原创 C++之异常
实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家随意抛异常,那么外层的调用者基本就没办法玩了,所以实际中都会定义一套继承的规范体系。这样大家抛出的都是继承的派生类对象,捕获一个基类就可以了。(异常一般是在比较大的项目中才会出现的)基类一般包含这两个成员errmsg与id,比如说:微信发消息,如果是出现权限问题(本来我们是好友,但是对方把你拉黑了),我给你发消息就失败了,就直接报错,给一个提示“你已经不是对方的好友”。
2023-03-05 19:01:39 584
原创 C++之单例模式
Singleton.h中有一个callCount的定义,Singleton.h被Singleton.cpp和test.cpp都所包含。.h文件在.cpp文件中展开,.cpp会生成两个.obj(linux下叫做.o)然后这两个.obj中都有一个叫做callCount的变量。
2023-03-05 19:00:46 1172 3
原创 网络基础(一)
"协议"是一种约定比如:电话在刚刚兴起的时候,电话费是非常非常贵的,其中父子两个人因为电话费的问题形成了两个约定,比如你和你爸说,我去学校了,肯定得常联系,但是电话费太贵了,你就和你爸做了一个约定,如果1.我给家里打电话,电话响一声,我就挂掉,代表我是平安的。2.我给家里打电话,电话响两声,我就挂掉,代表我没钱了。3.我给家里打电话,电话响三声,我有其他事情要沟通,你就接电话。所以有一天,你爸在电话旁,看见来电是你,响了一声,你爸就知道,你是报平安的。
2022-11-10 09:17:40 3199
原创 C++之Map与Set的模拟实现
前言:看这篇博客前首先得看博主关于红黑树的实现:C++之红黑树_cls-evd的博客-CSDN博客目录前言:看这篇博客前首先得看博主关于红黑树的实现:C++之红黑树_cls-evd的博客-CSDN博客一、set与map的源码分析源码中的set:编辑源码中的map:编辑源码中的红黑树:编辑二、map与set的建立三、红黑树节点的修改四、红黑树的修改insert的修改五、迭代器的实现迭代器的大框架begin的实现end的实现operator++的实.
2022-05-28 20:49:51 516 1
原创 C++之红黑树
红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。 4.2.2 红黑树的性质 1. 每个结点不是红色就是黑色 2. 根节点是黑色的3. 如果一个节点是红色的,则它的两个孩子结点是黑色的,但是没有连续的红节点4. 对于每个结点,从该结点到其所有后代叶结点的简单路径...
2022-05-23 22:03:00 2178 7
原创 C++之AVL树
前面对map/multimap/set/multiset进行了简单的介绍,在其文档介绍中发现,这几个容器有个共同点是: 其底层都是按照二叉搜索树来实现的,但是二叉搜索树有其自身的缺陷,假如往树中插入的元素有序或者接近有序,二叉搜索树就会退化成单支树,时间复杂度会退化成O(N),因此map、set等关联式容器的底层结构是对二叉树进行了平衡处理,即采用平衡树来实现。AVL 树AVL树的概念 二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表
2022-05-23 21:20:30 1088
原创 C++进阶之map与set
stl中将数据结构叫做容器。容器分为序列式容器:vector/list... 就类似线性表关联史容器:map/set.. 数据之间有强烈的关联性,底层是搜索树栈和队列是适配器set底层就是搜索树。void test_set1(){ //排序+去重 set<int> s; s.insert(3); s.insert(1); s.insert(8); s.insert(2); s.insert(5); s.insert(5); s.insert(5)
2022-05-23 20:39:37 2776
原创 Linux下如何将代码上传到Gitee中
git status 查看当前本地代码与本地仓库的对应关系我们看到需要我们进行添加,添加完毕后,再次查看。接下来用git commit -m "日志"命令这个日志是必须要填写的,否则就会报错。并且这个日志不能胡写,这个日志代表你本次修改或者提交等非常重要的信息。此时再用git push 将你的命令提交到远端 ,需要输入你的用户名与密码(gitee的)此时再次git status 下,就会看到我们的工作已经完成了。此时我们的仓库就有了我们传入的procgit..
2022-05-16 17:21:48 1493 2
原创 C++之二叉树进阶
二叉搜索树之前我们提过普通二叉树价值不大,二叉树要叠加一些性质才能变的非常有价值。二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值 它的左右子树也分别为二叉搜索树比如查6,比根大在右树去找,比7小在左树去找就找到了,一共三次。最多查找高度次O(logN) (这是在不极端的情况下,能做到满二叉树或完全二叉树的情况) 。eg:10亿个数
2022-05-08 21:10:46 628
原创 C++进阶之多态
多态的概念 概念:多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。静态的多态:函数重载,看起来调用同一个函数有不同的行为。静态指的是在编译时实现的。eg:流提取运算符的重载,自动识别不同的类型动态的多态:一个父类的引用或者指针去调用同一个函数,传递不同的对象,会调用不同的函数。动态就是指运行时实现的。本质:不同的人去做同一件事情,结果不同eg:class Person {public: virtual void Bu
2022-04-27 17:40:03 1735 4
原创 VS如何在debug版本下查看内联函数的优化?
我们都知道在debug版本下,inline优化在调试过程中是看不到的,只有在release版本下,你定义的内联函数才会被优化,但是release版本是不能进行调试的。为了观察到inline的优化,我们可以通过更改debug版本的一些属性实现观察。步骤1:右键单击你的项目单击属性步骤二:找到C/C++中的常规,将调试信息格式更改为程序数据库。步骤三:将优化中的内联函数扩展更改为只适用yu_inline(/Ob1).这样就可以在debug版本下中的调试观测到内...
2022-04-27 17:06:59 1948
原创 C++进阶之继承
继承的本质是一个复用,之前复用最多的地方是函数中复用,继承则体现在类假设我设计老师与学生这两个类,发现他俩具共同有的,有都有自己独立拥有的,如果我们像下图一样再写一遍,就会造成代码冗余为了解决这个问题就需要用到继承,我们可以用一个Person类存放他俩公有的,用Person链接teacher和student,这样就保证了student和teacher可以用Person中的信息这个Person就叫做父类或者基类,student和teacher就叫做子类或者派生类。体现在语法上就是.
2022-04-20 18:31:56 1747 1
原创 数据结构之二叉树
顺序存储:顺序结构存储就是使用数组来存储,一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费。而现实中使用中只有堆才会使用数组来存储,关于堆之前已经讲解过。二叉树顺序存储在物理上是一个数组,在逻辑上是一颗二叉树。 链式存储二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。 通常的方法是链表 中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结 点的存储地址 。链式结构又分为二叉链和三叉链,当前我..
2022-03-22 17:38:15 3099 7
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人