- 博客(134)
- 资源 (2)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 C++ 一篇文章让你知道智能指针的魅力
前情提要我们知道除了静态内存和栈内存外,每个程序还有一个内存池,这部分内存被称为自由空间或者堆。程序用堆来存储动态分配的对象即那些在程序运行时分配的对象,当动态对象不再使用时,我们的代码必须显式的销毁它们。在C++中,动态内存的管理是用一对运算符完成的:new和delete,ne:在动态内存中为对象分配一块空间并返回一个指向该对象的指针,delete指向一个动态独享的指针,销毁对象,并释放与之关联的内存。动态内存管理经常会出现两种问题:一种是忘记释放内存,会造成内存泄漏;一种是尚有指针引用内存的情况下
2021-05-31 21:07:59
2363
12
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 数据结构 5分钟带你搞定哈希表(建议收藏)!!!
对比之前博客讨论的二叉排序树 二叉平衡树 红黑树,它们的查找都是先从根节点进行查找,从节点取出数据或索引与查找值进行比较。那么,有没有一种函数H,根据这个函数和查找关键字key,可以直接确定查找值所在位置,而不需要一个个比较。这样就预先知道key所在的位置,直接找到数据,提升效率散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在内存存储位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做哈希函数,存
2021-05-26 16:39:38
35714
31
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 C++ vector类的模拟实现
vector和string虽然底层都是通过顺序表来实现的,但是他们利用顺序表的方式不同,string是指定好了类型,通过使用顺序表来存储并对数据进行操作,而vector是利用了C++中的泛型模板,可以存储任何类型的数据,并且在vector中,并没有什么有效字符和容量大小的说法,底层都是通过迭代器进行操作的,迭代器底层实现也就是指针,所以说,vector是利用指针对任何顺序表进行操作的。vector属性_start用于指向第一个有效元素_finish用于指向最后一个有效元素的下一个位置_endOf
2021-04-04 16:33:29
4840
14
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 小米11全系机型补齐,超大杯压场,但Pro版也不容忽视
小米2021年的首场新品发布会在3月29日正式开启,但由于此次发布会新品众多,因此分为两天举行,在已经结束的发布会第一天,小米带来了备受期待的小米11系列大杯和超大杯,不过因为超大杯——小米11 Ultra过于优秀和惊艳,同系登场的小米11 Pro光环似乎被压制,但实际上小米11 Pro仍然是不可忽视的一款机型,因为在当前的高端旗舰市场中,它面临的竞争对手数量超过了小米11 Ultra。小米11 Pro的设计ID没有改变,延续了小米11的外观,只是配色方面选择了较为沉稳的色系,其中包括黑色、紫色和绿色。
2021-03-30 15:15:06
2882
5
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 Linux 进程间通信(IPC)---大总结
什么是进程间通信每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程A把数据从用户空间拷到内核缓冲区,进程B再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信进程间通信方式管道本质:在内核中开辟一块缓冲区;若多个进程拿到同一个管道(缓冲区)的操作句柄,就可以访问同一个缓冲区,就可以进行通信分类:匿名管道 和 命名管道匿名管道:在内核中的缓冲区是没有具体的标识符的,匿名管道只能用于具有亲缘关系的
2021-03-22 13:49:42
11323
11
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 红米K40使用半个月,谈谈上手体验,“优缺点”非常明显!
转自:王石头最近智能手机市场可谓是相当热闹,各大手机厂商都推出了自家的新旗舰,每款产品都很抢眼,确实得到了不少消费者的关注,同时近期推出的一些新机,也出现了不少畅销型号。小米旗下Redmi品牌, 2月25日发布了K40系列旗舰机,这款产品便是目前的热门机型之一,首销5分钟销量破30万台,这样的成绩放在国产旗舰手机中,确实是个不错的成绩。Redmi K40系列已经发布有一阵子了,自3月4日开售到现在,时间也已经过去了半个月,这款手机究竟值不值得入手呢,下面笔者就将Redmi K40的体验分享给大家。
2021-03-20 20:15:33
6687
10
原创 Windows下如何安装MySQL服务
1、到官网进行下载MySQL官网下载下载后将其解压(注意不要放在中文路径、有空格或特殊字符的路径中)2、配置环境变量右键此电脑 -> 高级系统设置 -> 环境变量 -> 在下面系统变量栏点新建 ->变量名:MYSQL_HOME变量值:为MySQL解压的根目录在系统变量栏找到 Path 变量并双击%MYSQL_HOME%\bin3、配置MySQL初始化文件在MySQL根目录下创建初始化文件my.ini,即C:\Tool\mysql-8.0.24-win
2021-07-05 13:34:47
10787
7
原创 项目 点餐系统
项目介绍项目名称点餐系统项目简介用户通过浏览器访问服务器获得菜品信息进行点餐,管理员可以通过浏览器访问服务器对订单及菜品进行管理开发环境Linux项目开发语言及工具C++、Makefile、vim、g++、Json、mysql、http、线程、socket、stl技术概要相类似的MVC框架:其中业务模块是管理数据的,如菜品信息和菜品订单,外界想要访问数据必须通过这个模块来完成。用户界面模块也就是浏览器前端界面,用户或者管理员的操作都是通过这个界面来完成的。业务控制模块主要是针对页面请求完
2021-06-22 10:11:00
1965
1
原创 linux下如何升级gcc和g++编译器
1、sudo yum -y intall epel-release2、sudo yum install centos-release-scl-rh centos-release-scl3、sudo yum install devtoolset-7-gcc 4、sudo yum install devtoolset-7-gcc-c++5、将以下命令复制到~/.bashrc文件下source /opt/rh/devtoolset-7/enable...
2021-06-10 15:59:16
705
原创 centos如何安装数据库mysql
切换用户1、切换到root用户进行操作安装服务客户端1、安装 mariadb 服务yum install -y mariadb-server2、安装 mariadb 命令行客户端yum install -y mariadb3、安装 mariadb C libraryyum install -y mariadb-libs4、安装 mariadb 开发包yum install -y mariadb-devel修改文件配置1、更改 /etc/my.cnf.d/client.cnf
2021-06-10 15:53:41
782
1
原创 项目 协程-实现非抢占式TCP服务器
协程(Coroutines)是用户态下的非抢占式的轻量级线程,是一种在程序开发中处理多任务的组件项目介绍项目开发环境Linux项目开发语言及工具C、vim、gcc、gdb、Makefile项目特点协程是完全由程序来控制的,是在用户态下执行,这样子就没有用户态到内核态的切换开销协程是非抢占式的调度,用户可以自己实现调度,同一时间只能有一个协程在执行,并且由协程主动交出控制权协程的执行效率非常高。因为子程序切换不是线程切换,而是由程序自身控制,与同等数量的线程相比,协程的执行效率会更高项
2021-06-09 22:46:54
522
11
原创 linux ucontext族函数的原理及使用
ucontext函数族这里的context族是偏向底层的,其实底层就是通过汇编来实现的,但是我们使用的时候就和平常使用变量和函数一样使用就行,因为大佬们已经将它们封装成C库里了的我们先来看看寄存器寄存器:寄存器是CPU内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果我们常用的寄存器是X86-64中的其中16个64位的寄存器,它们分别是%rax, %rbx, %rcx, %rdx, %esi, %edi, %rbp, %rsp%r8, %r9, %r10, %r11, %r
2021-06-09 14:50:47
4032
13
原创 设计模式 C++装饰模式
买了新房(毛坯房)需要装修,对新房进行装修并没有改变房子用于居住的本质,但它让房子变得更漂亮,更加满足居家的需求。在软件设计中,我们也可以用类似的技术对原有对象(新房)的功能进行扩展(装修),以获得更加符合用户需求的对象。这种技术在设计模式中称为装饰模式装饰模式可以在不改变一个对象本身的基础上给对象增加额外的新行为,在现实生活中,这种情况比比皆是,如一张照片,可以不改变照片本身,给它增加一个相框,使得它具有防潮的功能,而且用户可以根据需要给它增加不同类型的相框,甚至可以在一个小相框的外面再套一个大相框使
2021-06-05 11:31:39
324
2
原创 设计模式 C++观察者模式
无论是在现实世界中还是在软件系统中,人们常常会遇到这样一类问题,一个对象的状态改变会引发其他对象的状态改变,如十字路口的交通信号灯,红灯亮则汽车停,绿灯亮则汽车行,再如点击软件中一个按钮,则会弹出一个窗口。这些对象之间存在一种依赖关系,一个对象的行为会导致依赖它的其他对象发生反应,为了更好地描述这种对象之间的依赖关系,我们需要学习一种新的行为型设计模式,即观察者模式,它是软件设计与开发中使用频率最高的设计模式之一定义思想:定义对象间一种一对多的依赖关系,使得每当一个对象状态发生改变时,其他相关对象皆得到通
2021-06-04 12:59:15
247
原创 设计模式 C++外观者模式
无论是在现实生活中还是在软件开发过程中,人们经常会遇到这样一类情况:需要和多个对象打交道,例如用户在自行组装计算机时需要购买显示器、主板、硬盘、内存、CPU 等硬件设备,组装过程麻烦而且可能还会存在设备不兼容,而直接购买已由专业人士组装好的计算机则可以省去这些麻烦。我们无须购置设备,通过专业计算机组装人员可以获得一台完整的计算机。由于计算机组装人员的出现,简化了用户与多个设备之间的交互,使得用户不需要关心设备的组装细节即可使用它们,在这里,计算机组装人员充当了一个我们称之为“外观类”的角色,通过它可以简化用
2021-06-03 17:17:16
244
原创 设计模式 C++抽象工厂模式
推荐阅读设计模式 C++工厂方法模式品牌知名度逐渐提高,不单单只生产一种产品,如果我们继续使用一个工厂对应一种产品,那么假如有三个品牌华为、小米、苹果。他们各自都要三种产品,分别为手机、耳机、笔记本电脑。则此时我们需要创建9个工厂才能实现,类多了代码的实现和维护起来也是非常麻烦的。此时我们就必须引入一种新的模式----抽象方法模式定义思想:抽象工厂模式是工厂方法模式的泛化版,工厂方法模式是一种特殊的抽象工厂模式。在工厂方法模式中,每一个具体工厂只能生成一种具体产品,而在抽象工厂方法模式中,每一个具体工
2021-06-03 15:41:56
297
2
原创 设计模式 C++工厂方法模式
推荐阅读设计模式 C++简单工厂模式工厂方法模式是在简单工厂模式的缺点上进行优化的,我们都知道,在简单工厂模式中,要去增加或者减少一个产品的类型,都需要修改工厂中的if-else判断。这样子显然不符合我们代码开发中的开闭原则,拓展起来也是非常麻烦的工厂方法模式 = 简单工厂模式 + “开闭原则”定义思想:工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的就是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类优点:不需
2021-06-03 14:27:54
336
4
原创 设计模式 C++简单工厂模式
在我们要使用一个对象时,就必须通过类来实例化对象,也就是需要new一个对象。在new的过程是非常复杂的,要经过读文件->解析文本->创建对象->给属性设值等过程。而引入工厂模式,就是将创建类的这个步骤又工厂来帮我们完成,我们只需要去使用工厂里创建好的类即可。在使用工厂时,我们需要让工厂知道我们想要的一个对象,所以我们可以通过传参的方式去告诉工厂我们的需求优点:实现了客户端和具体实现类的解耦客户端免除了直接创建产品对象的责任,而仅仅“消费”产品产品客户端无需知道所创建的具体产品类的
2021-06-03 13:48:32
284
1
原创 C++ lambda表达式
lambda表达式最先出现于python脚本语言,在运行时候才会一行一行的解释指令,速度虽然满,但是对于程序员来说减少了大量的代码工作,语法相对更加简单lambda表达式是一个匿名的函数完整表达式:[capture-list](parameters)mutable->return-type{statement}[]中的变量就是可以将上下文中的变量引入到匿名函数中去使用,默认属性为const()中的变量为函数的参数列表,定义方式和普通函数一样,可省略,但是如果添加mutable属性后即使()为空
2021-05-31 10:00:14
383
原创 C++ C++11新特性--右值引用
左值与右值在C语言中,左值和右值一般有两种区分的方法。可以出现在赋值符号“=”的两边的值为左值,只能出现在赋值符号“=”的右边的值为右值;还有一种说法是能取地址的为左值,不能取地址的为右值。但是这两种说法并非完全正确void test(){ int a = 10; int b = a;//ok a为左值 10 = a; //error 10为右值 int* pa = &a;//ok int* pi = &10;//error}而在C++中,右值有3种变量,分别为常量、
2021-05-30 21:24:06
704
8
原创 C++ 布隆过滤器原理及实现
概念布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。例如我们要我找在40亿个数据中查找某字符串是否存在,我们也是第一想到的是通过遍历一个一个去比对,但是数据庞大,遍历消耗很多的时间和空间的资源。但是我们可以通过一位图+哈希来解决这个问题。在常数时间内判断该字符串是否存在。位图+哈希,我们称为布隆过滤器。其
2021-05-28 16:17:33
847
10
原创 C++ 位图及位图的实现
概念位图就是bitmap的缩写,所谓bitmap,就是用每一位来存放某种状态,适用于大规模数据,该数据都是不重复的简单数据。通常是用来判断某个数据存不存在的例如:给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中如果不看数据量,我们第一想到的肯定就是依次从头遍历,但是这个数据量是非常大的,有40亿,遍历40亿次消耗的时间和内存是非常多的。但是引入位图后,就可以专门解决这种大量数据查找是否存在的问题。查找这个数是否存在所消耗的时间复杂度
2021-05-28 14:57:51
2935
22
原创 网络 一篇博文搞懂五种常见的IO模型
概念前情阻塞:为了完成一个功能,发起调用,若不具备完成功能的条件,则调用一直阻塞等待非阻塞:为了完成一个功能,发起调用,若不具备完成功能的条件,则立即返回一个状态值阻塞与非阻塞的区别:常用于讨论函数是否阻塞,表示这个函数无法立即完成功能时是否立即返回同步:功能完成的流程通常是顺序化的,并且功能由进程自身完成异步:功能完成的流程通常是不确定的,并且功能由系统完成同步与异步的区别:通常用于讨论功能的完成方式,表示一个功能是否是顺序化且是否由自己来完成异步的种类:异步阻塞----等待别人完成功能。异
2021-05-27 15:18:26
520
12
原创 C++ 简单实现unorderset和unordermap
unorderset和unordermap是C++11中心引入的一种关联式容器。set和map与他们之间的不同之处就是遍历时是否有序,通过名字就可以看出,unorderset和unordermap在遍历时是无序的。之所他们有这样的差异,是因为他们底层的实现的数据结构是不同的,unorderset和unordermap底层是通过哈希表来实现的,而set和map底层是通过红黑树来实现的。unorderset和unordermap的插入和查找的效率非常高,这也会引入他们的原因之一。下面我们一起来看看如何实现的看
2021-05-26 16:41:50
598
7
转载 Linux 线程安全常用的锁机制
转自:https://blog.csdn.net/qq_35423154/article/details/109259881 文章目录 乐观锁 VS 悲观锁悲观锁乐观锁 CASCAS机制ABA问题CAS的优缺点 互斥锁 VS 自旋锁互斥锁自旋锁对比及应用场景 读写锁实现方式读写锁 VS 互斥锁 乐观锁 VS 悲观锁 乐观锁和悲观锁故名思意,它们的区别就是做事的心态不同。 悲观锁 悲观锁做事比较悲观,它始终认为共享资源在我们使用的时候会被其他线程修改,容易导致线程安全的问
2021-05-25 15:09:56
374
1
原创 C++ map的简单实现
map和set的底层都是通过红黑树来实现的,但并不是原生态的红黑树,而是经过改造后的红黑树。且容器都会在各自的类中添加一些独特的函数来解决各自适配的问题map和set底层是改造后的红黑树,我们先来看看改造后的红黑树和普通的红黑树不同的是,在根节点上再加了一个头结点,该结点不是真实的结点,只是一个辅助结点,是为了后面实现红黑树的迭代器而出现的。该header结点的父节点就是真实的根节点,其左孩子是这棵树的最左结点,其右孩子是这棵树的最右节点。我们现在通过STL源码来简单剖析一下map和set中如何利用
2021-05-23 13:19:49
5659
21
原创 数据结构 红黑树(RBTree)的原理与实现
学习红黑树之前你应该保证你学过AVL树,也就是平衡二叉搜索树数据结构 AVL树AVL树是一棵高度平衡的二叉搜索树,其要求每个结点的高度差不能大于1,这样子就保证了其查询的时间复杂度为log2(N),不会出现单支树而导致时间复杂度退化到线性时间。但是AVL树的插入和删除性能非常低下,只要稍微不平衡,都需要进行旋转操作,实现起来也相对困难。所以如果当你需要查询效率高且有序时你可以有优先选择AVL树,但是如果你所需的数据结构是频繁的插入与删除,且需要高效查询且有序时,你可以优先考虑红黑树(RBTree)红黑
2021-05-20 17:15:35
984
13
原创 数据结构 AVL树
AVL树二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下平衡二叉搜索树(Self-balancing binary search tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树平衡因子某结点的右子树与左子树的高度(深度)差即为该结点的平衡因子。平衡二叉树上所有结点的平衡因子只可能是 -1,0 或 1实现结点
2021-05-17 13:58:40
773
原创 C++ 关联容器set | map | multiset | multimap
前情提要根据应用场景的不桶,STL总共实现了两种不同结构的管理式容器:树型结构与哈希结构。树型结构的关联式容器主要有四种:map、set、multimap、multiset。这四种容器的共同点是:使用平衡搜索树(即红黑树) 作为其底层结果,容器中的元素是一个有序的序列。他们都是底层都是通过<key, value>结构的键值对来存储的C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构
2021-05-14 13:43:32
221
1
原创 数据结构 二叉搜索树BST的实现与应用
概念二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树:1、若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;2、若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;3、它的左、右子树也分别为二叉排序树。作用:二叉搜索树作为一种经典的数据结构,它既有链表的快速插入与删除操作的特点,又有数组快速查找的优势;所以应用十分广泛,例如在文件系统和数据库系统一般会采用这种数据结构进行高效率的排序与检索操作
2021-05-11 09:07:09
430
原创 C语言 判断一个数是否为素数
除了1和它本身以外,不能被任何整数整除的数,就称为素数,例如17就是素数,因为它不能被2-16的任一整数整除m能被2~m-1之间任一整数整除,其两个因子必有一个小于或者等于√m,另一个大于或者等于√m。例如16能被2、4、8整除,16=2* 8中,2小于4,8大于4。在16=4* 4中4=√16。因此只需要判定 2 ~ 4之间有无因子即可。只需要被2 ~ √m之间的每一个整数去除就可以了代码:bool isPrime(int n){ for (int i = 2; i <= sqrt(
2021-05-10 13:06:13
743
原创 网络 DNS域名系统、ICMP协议、NAT/NAPT服务、代理服务
DNSDNS(Domain Name System)域名系统,用于存储IP地址与域名的映射关系,提供域名解析,通过域名获取服务器IP地址的服务域名:服务器地址的别名----便于记忆,但是最终通过域名访问服务器时还是要域名解析成IP地址来访问服务器注:一个域名可能对应多个IP地址当一个公司要给另一个公司发数据,就必须要知道对方的IP地址,可是当公司越来越多,记录IP地址就越来越麻烦。此时就有大佬想到了一个很好的解决方法hosts文件----记录服务器地址和IP地址之间的映射关系Hosts是一个没有
2021-05-10 11:13:24
453
原创 网络 链路层 | 以太网协议与ARP协议
数据链路层是计算机网络的底层,主要负责相邻设备之间的数据帧传输链路层就是负责每一个相邻结点之间的数据传输,但是相邻设备之间也需要描述识别,主要是因为每一个设备都有可能有多个相邻的设备。这种识别在链路层中是通过MAC地址来实现的MAC地址:mac地址就是网卡的硬件地址,用于识别相邻的设备,它是一个无符号6字节的整数 uint8_t mac[6]以太网协议以太网协议格式目的地址和源地址:描述识别相邻的设备之间的数据传输上层协议类型:网络层的协议类型,进行数据分用时选择上层的解析协议数据:网络层
2021-05-10 10:22:18
1196
原创 网络 网络层 | IP协议、网段划分、公网与私网、路由选择
网络层是用信子网的边界,是通信设备的协议最高层.其功能是负责地址管理与路由选择(为每一条网络中的数据根据想去的地方选择合适的路径),典型的协议是IP协议,典型的设备是路由器IP协议IP协议的工作类似于邮政服务,事先不需要通知版本号:包含IP版本号,例如IPV4/IPV6首部长度:标识IP报头的长度,以4字节为单位(最小20字节/最大60字节)服务类型:用于确定每个数据报的优先级级别报文总长度:指头部和数据之和的长度,单位为字节,因此数据报的最大长度不超过64k,总长度必须不超过数据链路层中.
2021-05-08 17:39:31
1980
原创 网络 传输层 | UDP协议与TCP协议详解(三次握手及四次挥手、滑动窗口、拥塞控制)
概念传输层:是负责应用程序之间的数据传输(通过端口的描述,描述了哪两个进程间的通信);传输层的两个主要协议:UDP 和 TCPUDP协议UDP协议全称:用户数据报协议(User Dategram Protocol, UDP)协议典型特性:无连接、不可靠、面向数据报UDP协议格式用户数据报UDP有两个字段:报头字段和数据字段报头字段包含4个内容:源端口号、目的端口号、UDP总长度、校验和。总共8个字节1、源端口号:UDP源端口号:占16位,在需要对方回信时选用。不需要时可全为0;2、目
2021-05-03 14:02:29
2871
原创 网络 滑动窗口机制
滑动窗口机制滑动窗口是一种流量控制技术,滑动窗口概念不仅存在于数据链路层,也存在于传输层,两者有不同的协议,但是基本原理是很相近的。其中一个重要的区别是,一个是针对帧的传送,一个是字节数据的传送。在TCP的滑动窗口协议中,滑动窗口以字节为单位,主要功能是进行数据流量管理,平衡两端之间的数据吞吐量,解决丢包问题。其基本原理是在任意时刻,发送方都维持了一个连续的允许发送的字节序号,称为发送窗口;同时,接收方也维持了一个连续的允许接收的字节序号,称为接收窗口。一个窗口的大小是由一个后沿序号和一个前沿序号来控
2021-05-03 14:01:05
1647
原创 网络 卧槽!牛皮了,面试官居然把TCP三次握手四次挥手问的这么详细
一、为什么握手是三次,而不是两次或者四次?答:两次不安全,四次没必要。tcp通信需要确保双方都具有数据收发的能力,因此双方都要发送SYN确保对方具有通信的能力二、为什么挥手是四次而不是三次?答:发送FIN包只能表示对方不再发送数据了,不代表对方不再接收数据,因此被动关闭方进行ACK回复之后有可能还会继续发送数据,等到不再发送数据了才会发送下一个FIN包,因此FIN包和ACK包是分开的...
2021-05-03 13:57:42
78009
86
原创 C++ 面向对象程序三大特性之 多态
多态的概念不同类的对象对同一消息作出不同的响应就叫做多态,通俗来讲,就是去完成某个行为,当不同的对象去完成时会产生出不同的结果例如去网吧上机,如果你是vip,那么你上网的价格就会比普通用户上网的价格低;如果你不是vip,那么你上网的价格就是原价。这就是生活中的一种多态现象多态的定义及使用例如以下程序,就是一种多态的体现class Vip{public: virtual void online() { cout << "7折优惠" << endl; }};
2021-05-02 10:45:12
1766
7
原创 C++ 面向对象程序三大特性之 继承
继承的概念继承:继承是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类的特性的基础上进行扩展,增加功能。产生新的一个类。我们之前复用手段都是通过函数或者模板函数来实现的,而继承上升到类的层次上面。原有的类称为是父类或者基类,而继承了该类的类称为子类或者派生类继承的定义及使用继承格式:class childName : 继承方式 parentName例如下面代码,B类继承了A类//父类 基类class A{public: void printA() { co
2021-04-28 11:45:53
534
5
原创 C++ vector和list的区别及使用场景
区别:1、vector底层是连续结构;list底层是非连续结构2、vector支持随机访问;list不支持随机访问3、vector迭代器是原生指针;list迭代器是封装结点的一个类4、vector在插入和删除时可能会导致迭代器失效;list在删除的时候会导致当前迭代器指向的结点失效5、vector不容易造成内存碎片,空间利用率高;list容易造成内存碎片,空间利用率低6、vector在非尾插,删除的时间复杂度为O(n),list在任何地方插入和删除的时间复杂度都为O(1)使用场景:vecot
2021-04-22 20:54:35
2686
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人