自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

WhiteShirtI的博客

看了就有大收获的博客

  • 博客(22)
  • 资源 (2)
  • 收藏
  • 关注

原创 C++ 一篇文章让你知道智能指针的魅力

前情提要我们知道除了静态内存和栈内存外,每个程序还有一个内存池,这部分内存被称为自由空间或者堆。程序用堆来存储动态分配的对象即那些在程序运行时分配的对象,当动态对象不再使用时,我们的代码必须显式的销毁它们。在C++中,动态内存的管理是用一对运算符完成的:new和delete,ne:在动态内存中为对象分配一块空间并返回一个指向该对象的指针,delete指向一个动态独享的指针,销毁对象,并释放与之关联的内存。动态内存管理经常会出现两种问题:一种是忘记释放内存,会造成内存泄漏;一种是尚有指针引用内存的情况下

2021-05-31 21:07:59 2367 12

原创 数据结构 5分钟带你搞定哈希表(建议收藏)!!!

对比之前博客讨论的二叉排序树 二叉平衡树 红黑树,它们的查找都是先从根节点进行查找,从节点取出数据或索引与查找值进行比较。那么,有没有一种函数H,根据这个函数和查找关键字key,可以直接确定查找值所在位置,而不需要一个个比较。这样就预先知道key所在的位置,直接找到数据,提升效率散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在内存存储位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做哈希函数,存

2021-05-26 16:39:38 36668 31

原创 C++ lambda表达式

lambda表达式最先出现于python脚本语言,在运行时候才会一行一行的解释指令,速度虽然满,但是对于程序员来说减少了大量的代码工作,语法相对更加简单lambda表达式是一个匿名的函数完整表达式:[capture-list](parameters)mutable->return-type{statement}[]中的变量就是可以将上下文中的变量引入到匿名函数中去使用,默认属性为const()中的变量为函数的参数列表,定义方式和普通函数一样,可省略,但是如果添加mutable属性后即使()为空

2021-05-31 10:00:14 400

原创 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 742 8

原创 C++ 布隆过滤器原理及实现

概念布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。例如我们要我找在40亿个数据中查找某字符串是否存在,我们也是第一想到的是通过遍历一个一个去比对,但是数据庞大,遍历消耗很多的时间和空间的资源。但是我们可以通过一位图+哈希来解决这个问题。在常数时间内判断该字符串是否存在。位图+哈希,我们称为布隆过滤器。其

2021-05-28 16:17:33 865 10

原创 C++ 位图及位图的实现

概念位图就是bitmap的缩写,所谓bitmap,就是用每一位来存放某种状态,适用于大规模数据,该数据都是不重复的简单数据。通常是用来判断某个数据存不存在的例如:给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中如果不看数据量,我们第一想到的肯定就是依次从头遍历,但是这个数据量是非常大的,有40亿,遍历40亿次消耗的时间和内存是非常多的。但是引入位图后,就可以专门解决这种大量数据查找是否存在的问题。查找这个数是否存在所消耗的时间复杂度

2021-05-28 14:57:51 2972 22

原创 网络 一篇博文搞懂五种常见的IO模型

概念前情阻塞:为了完成一个功能,发起调用,若不具备完成功能的条件,则调用一直阻塞等待非阻塞:为了完成一个功能,发起调用,若不具备完成功能的条件,则立即返回一个状态值阻塞与非阻塞的区别:常用于讨论函数是否阻塞,表示这个函数无法立即完成功能时是否立即返回同步:功能完成的流程通常是顺序化的,并且功能由进程自身完成异步:功能完成的流程通常是不确定的,并且功能由系统完成同步与异步的区别:通常用于讨论功能的完成方式,表示一个功能是否是顺序化且是否由自己来完成异步的种类:异步阻塞----等待别人完成功能。异

2021-05-27 15:18:26 535 12

原创 C++ 简单实现unorderset和unordermap

unorderset和unordermap是C++11中心引入的一种关联式容器。set和map与他们之间的不同之处就是遍历时是否有序,通过名字就可以看出,unorderset和unordermap在遍历时是无序的。之所他们有这样的差异,是因为他们底层的实现的数据结构是不同的,unorderset和unordermap底层是通过哈希表来实现的,而set和map底层是通过红黑树来实现的。unorderset和unordermap的插入和查找的效率非常高,这也会引入他们的原因之一。下面我们一起来看看如何实现的看

2021-05-26 16:41:50 604 7

转载 Linux 线程安全常用的锁机制

转自:https://blog.csdn.net/qq_35423154/article/details/109259881 文章目录 乐观锁 VS 悲观锁悲观锁乐观锁 CASCAS机制ABA问题CAS的优缺点 互斥锁 VS 自旋锁互斥锁自旋锁对比及应用场景 读写锁实现方式读写锁 VS 互斥锁 乐观锁 VS 悲观锁 乐观锁和悲观锁故名思意,它们的区别就是做事的心态不同。 悲观锁 悲观锁做事比较悲观,它始终认为共享资源在我们使用的时候会被其他线程修改,容易导致线程安全的问

2021-05-25 15:09:56 380 1

原创 C++ map的简单实现

map和set的底层都是通过红黑树来实现的,但并不是原生态的红黑树,而是经过改造后的红黑树。且容器都会在各自的类中添加一些独特的函数来解决各自适配的问题map和set底层是改造后的红黑树,我们先来看看改造后的红黑树和普通的红黑树不同的是,在根节点上再加了一个头结点,该结点不是真实的结点,只是一个辅助结点,是为了后面实现红黑树的迭代器而出现的。该header结点的父节点就是真实的根节点,其左孩子是这棵树的最左结点,其右孩子是这棵树的最右节点。我们现在通过STL源码来简单剖析一下map和set中如何利用

2021-05-23 13:19:49 5743 21

原创 数据结构 红黑树(RBTree)的原理与实现

学习红黑树之前你应该保证你学过AVL树,也就是平衡二叉搜索树数据结构 AVL树AVL树是一棵高度平衡的二叉搜索树,其要求每个结点的高度差不能大于1,这样子就保证了其查询的时间复杂度为log2(N),不会出现单支树而导致时间复杂度退化到线性时间。但是AVL树的插入和删除性能非常低下,只要稍微不平衡,都需要进行旋转操作,实现起来也相对困难。所以如果当你需要查询效率高且有序时你可以有优先选择AVL树,但是如果你所需的数据结构是频繁的插入与删除,且需要高效查询且有序时,你可以优先考虑红黑树(RBTree)红黑

2021-05-20 17:15:35 998 13

原创 数据结构 AVL树

AVL树二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下平衡二叉搜索树(Self-balancing binary search tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树平衡因子某结点的右子树与左子树的高度(深度)差即为该结点的平衡因子。平衡二叉树上所有结点的平衡因子只可能是 -1,0 或 1实现结点

2021-05-17 13:58:40 885

原创 C++ 关联容器set | map | multiset | multimap

前情提要根据应用场景的不桶,STL总共实现了两种不同结构的管理式容器:树型结构与哈希结构。树型结构的关联式容器主要有四种:map、set、multimap、multiset。这四种容器的共同点是:使用平衡搜索树(即红黑树) 作为其底层结果,容器中的元素是一个有序的序列。他们都是底层都是通过<key, value>结构的键值对来存储的C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构

2021-05-14 13:43:32 223 1

原创 数据结构 二叉搜索树BST的实现与应用

概念二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树:1、若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;2、若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;3、它的左、右子树也分别为二叉排序树。作用:二叉搜索树作为一种经典的数据结构,它既有链表的快速插入与删除操作的特点,又有数组快速查找的优势;所以应用十分广泛,例如在文件系统和数据库系统一般会采用这种数据结构进行高效率的排序与检索操作

2021-05-11 09:07:09 448

原创 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 746

原创 网络 DNS域名系统、ICMP协议、NAT/NAPT服务、代理服务

DNSDNS(Domain Name System)域名系统,用于存储IP地址与域名的映射关系,提供域名解析,通过域名获取服务器IP地址的服务域名:服务器地址的别名----便于记忆,但是最终通过域名访问服务器时还是要域名解析成IP地址来访问服务器注:一个域名可能对应多个IP地址当一个公司要给另一个公司发数据,就必须要知道对方的IP地址,可是当公司越来越多,记录IP地址就越来越麻烦。此时就有大佬想到了一个很好的解决方法hosts文件----记录服务器地址和IP地址之间的映射关系Hosts是一个没有

2021-05-10 11:13:24 456

原创 网络 链路层 | 以太网协议与ARP协议

数据链路层是计算机网络的底层,主要负责相邻设备之间的数据帧传输链路层就是负责每一个相邻结点之间的数据传输,但是相邻设备之间也需要描述识别,主要是因为每一个设备都有可能有多个相邻的设备。这种识别在链路层中是通过MAC地址来实现的MAC地址:mac地址就是网卡的硬件地址,用于识别相邻的设备,它是一个无符号6字节的整数 uint8_t mac[6]以太网协议以太网协议格式目的地址和源地址:描述识别相邻的设备之间的数据传输上层协议类型:网络层的协议类型,进行数据分用时选择上层的解析协议数据:网络层

2021-05-10 10:22:18 1208

原创 网络 网络层 | IP协议、网段划分、公网与私网、路由选择

网络层是用信子网的边界,是通信设备的协议最高层.其功能是负责地址管理与路由选择(为每一条网络中的数据根据想去的地方选择合适的路径),典型的协议是IP协议,典型的设备是路由器IP协议IP协议的工作类似于邮政服务,事先不需要通知版本号:包含IP版本号,例如IPV4/IPV6首部长度:标识IP报头的长度,以4字节为单位(最小20字节/最大60字节)服务类型:用于确定每个数据报的优先级级别报文总长度:指头部和数据之和的长度,单位为字节,因此数据报的最大长度不超过64k,总长度必须不超过数据链路层中.

2021-05-08 17:39:31 2010

原创 网络 传输层 | 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 2990

原创 网络 滑动窗口机制

滑动窗口机制滑动窗口是一种流量控制技术,滑动窗口概念不仅存在于数据链路层,也存在于传输层,两者有不同的协议,但是基本原理是很相近的。其中一个重要的区别是,一个是针对帧的传送,一个是字节数据的传送。在TCP的滑动窗口协议中,滑动窗口以字节为单位,主要功能是进行数据流量管理,平衡两端之间的数据吞吐量,解决丢包问题。其基本原理是在任意时刻,发送方都维持了一个连续的允许发送的字节序号,称为发送窗口;同时,接收方也维持了一个连续的允许接收的字节序号,称为接收窗口。一个窗口的大小是由一个后沿序号和一个前沿序号来控

2021-05-03 14:01:05 1681

原创 网络 卧槽!牛皮了,面试官居然把TCP三次握手四次挥手问的这么详细

一、为什么握手是三次,而不是两次或者四次?答:两次不安全,四次没必要。tcp通信需要确保双方都具有数据收发的能力,因此双方都要发送SYN确保对方具有通信的能力二、为什么挥手是四次而不是三次?答:发送FIN包只能表示对方不再发送数据了,不代表对方不再接收数据,因此被动关闭方进行ACK回复之后有可能还会继续发送数据,等到不再发送数据了才会发送下一个FIN包,因此FIN包和ACK包是分开的...

2021-05-03 13:57:42 78260 86

原创 C++ 面向对象程序三大特性之 多态

多态的概念不同类的对象对同一消息作出不同的响应就叫做多态,通俗来讲,就是去完成某个行为,当不同的对象去完成时会产生出不同的结果例如去网吧上机,如果你是vip,那么你上网的价格就会比普通用户上网的价格低;如果你不是vip,那么你上网的价格就是原价。这就是生活中的一种多态现象多态的定义及使用例如以下程序,就是一种多态的体现class Vip{public: virtual void online() { cout << "7折优惠" << endl; }};

2021-05-02 10:45:12 1772 7

Git-2.23.0-64-bit.zip

下载Git

2021-01-04

TortoiseGit-2.8.0.0-64bit.zip

git的图形界面工具

2021-01-04

空空如也

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

TA关注的人

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