- 博客(148)
- 收藏
- 关注
原创 通过基类的指针或引用调用虚函数构成多态
面向对象三大特征:封装 继承 多态在C++多态的实现是利用虚函数完成的,派生类对基类的虚函数重写,通过基类的指针或引用调用虚函数来实现多态的特性。本问重点讨论为什么必须是通过基类的指针或引用调用虚函数才能构成多态?我们将按照如下顺序逐步分析:1.什么是虚函数?在继承关系中,对基类的成员函数使用virtual关键字修饰后,该成员函数称为虚函数。继承该基类的派生类可以通过对虚函数重写实现多态。当然,派生类对基类的虚函数重写不是必须的。2.动态绑定和静态绑定动态绑定:在程序运行时才能确定
2022-05-11 14:33:38
2482
原创 B树、B+树和B*树
Hash、AVL树、红黑树等结构适用于内查找,当数据量比较大内存中无法加载时,这些数据结构就很难高效的查找。这时,就需要B树来解决。举个例子:我们熟悉的MySql数据库是将数据保存在一个个的table中,再将一个个的table保存在硬盘中的。每一个table都是一个二维结构,即行和列。如果业务比较大的时候,一个数据库中可能会存在很多的table,每个table有有很多的行和列。在MySQL数据库中每一行是一个表项,表示的是同一事务的信息,如果要在table中查找某个数据时我们可以将每个数据的prim
2021-08-16 16:09:41
570
1
原创 C++11---智能指针
在使用C++编程时,要求使用malloc/new申请出来的空间必须使用free/delete进行释放,如果程序员没有对使用malloc/new申请的空间在使用free/delete进行释放,则可能会造成内存泄露问题。但是,在C++中有些情况下,即使成员进行了释放也可能存在一些安全隐患,例如下面的程序:void MergeSort(int* a, int n){ int* tmp = (int*)malloc(sizeof(int)*n); _MergeSort(a, 0, n - 1
2021-08-02 11:04:46
456
原创 Linux --- 高级IO
1、举例理解五种IO模型钓鱼例子:钓鱼我们认为有两步,第一步就是等鱼上钩(记为“等”),第二步就是钓鱼(记为“掉”)。阻塞IO:在内核将数据准备好之前,系统调用会一直等待。所有的套接字默认都是阻塞方式的。钓鱼例子之张三钓鱼:张三是一个非常认真的人,他在钓鱼时只顾钓鱼,完全不受外界任何事情的影响。在等鱼上钩的过程中,他就静静的坐在凳子上看着鱼鳔,即使有人找他他也不会搭理。当鱼上钩时,将鱼钓上来再继续下一的等。...
2021-07-31 16:02:10
574
3
原创 C++11重点语法
1、列表初始化在C语言中对数组支持使用{}进行初始化,而在C++98对于vector这样的自定义类型不支持使用{}初始化,每次使用vector就必须先定义在使用for循环进行初始化,某些场景下是及其不方便的,在C++11中对很多自定义类型都支持使用{}进行初始化。1)对于内置类型和STL容器的列表初始化int main(){ //内置类型的列表初始化 int x1 = { 10 }; int x2{ 10 }; int x3 = { 2 + 5 }; int x4{ 2 + 5 }
2021-07-24 16:34:33
509
原创 哈希的应用
一、位图位图就是指使用一个比特位来表示某种事物的状态,适用于海量数据且无重复的场景,可以极大减少内存空间的使用。1、使用场景1)给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。一个unsigned int 占四个字节的内存空间,49亿个就需要占4*40字节 = 14G,在32位系统中内存一共就4个G,而14个G都无法存储。思路1:将40亿个数据保存在文件中,依次从文件中读取在进行比较。时间复杂度为O(N),读取文件存在IO操作,效率比较低
2021-07-21 23:08:14
614
原创 计算机网络---网络层
在TCP/IP四层模型中,网络层属于第二层。网络层的主要作用就是负责数据的跨网络传输,网络层最主要的协议是IP协议,一个重要的设备就是路由器负责数据的转发和路由的选择。1、IP概述如下图,主机A、B、C、D之间通过多个路由器连接。主机B要将数据跨网络发送给主机C,首先需要知道主机B的IP地址(源IP地址)和主机C的IP地址(目的IP地址),再将数据发送个路由器F,路由器F根据源IP和目的IP选择合适的路径将数据转发出去,最终到达主机C。通过上面的例子,可以发现网络层数据的跨网络传输离不开IP
2021-07-21 17:10:40
680
4
原创 简易内存池
目录一、内存池基础知识1、什么是内存池1.1 池化技术1.2 内存池2、内存池的作用2.1 效率问题2.2 内存碎片3、内存池技术的演进二、简易内存池原理1、整体设计2、细节剖析2.1 内存块如何用链表链接3、性能比较三、简易内存池完整源码一、内存池基础知识1、什么是内存池1.1 池化技术池化技术是计算机中的一种设计模式,主要是指:将程序中经常要使用的计算机资源预先申请出来,由程序自己管理,程序在使用时直接从“池”中获取,不仅保证了程序
2021-07-01 21:48:02
1202
4
原创 VMware Workstation player资源下载和Linux安装教程
VMware Workstation player免费版下载地址:Download VMware Workstation Player | VMware注意:点击链接选择Windows版下载,安装到需要填秘钥时直接点击跳过即安装非商业用途免费版centos下载地址:Index of /centos/8.2.2004/isos/x86_64/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror注意:进入后选择自己需要的版本进行下载,建议选择minimal
2021-06-27 22:22:33
3910
原创 SSL握手过程
HTTPS是一个比较安全的应用层协议,在通信前需要进行安全连接和交换参数,这个过程就称为“握手”。SSL握手过程的本质是在协商对称加密的秘钥。HTTPS协议的安全机制是靠SSL层来实现的,为了保证数据的安全性,在数据发送前需要对数据进行加密。传统的对称加密,协商秘钥过程如果被窃听导致秘钥泄露,加密的数据也就变得“公开透明”了,而使用非对称加密的方式效率较低。因此,在SSL中采用“对称加密个非对称加密结合”的方法保证数据的安全性,即非对称加密进行对称加密秘钥的协商,而这个协商过程就可以认为是SSL握手。
2021-06-24 20:34:34
5769
原创 C++---哈希(Hash Table)
一、unordered系列关联式容器STL库中提供了使用红黑树封装的map和set的关联式容器,查询效率可以达到logN,为了提高查询效率在C++11中,STL又提供了四个unor
2021-06-11 14:43:13
2736
8
原创 使用红黑树封装map和set
红黑树和AVL树都是二叉搜索树,但是从效率以及实现方式等方面综合来看,红黑树比AVL树更优。也就是说,红黑树是一种更好的,适合搜索的数据结构。同时,红黑树的使用方面非常广泛,Java库、linux内核、c++ST...
2021-06-07 20:23:44
940
5
原创 搜索算法---深度优先搜索
一、通过下面一个问题总结深度优先搜索问题:有编号为1~3的三张牌和编号为1~3的三个盒子,将三张牌放到三个盒子中且每个盒子只能放一张牌,问:一共有多少种方法?根据题意,每个盒子放的牌有三种可能(1号盒子放的牌可能是1、2或3,2号...)。假定,从1号盒子开始放,接着放2号、3号。 给1号盒子放牌时,由于1号盒子是第一个放的,因此有三种选择:1、2、3号牌。假定,第一次放入1号牌,第二次放入2号牌... 给2号盒子放牌,此时1号盒子已经放入了1号牌,因此2号盒子只能从2、3号盒子选一张牌放入,假
2021-06-07 17:26:39
5131
原创 计算机网络---传输层(tcp、udp)
一、再谈端口号端口号用来唯一标识一台主机上通信的进程,在tcp协议中用“源”二、UDP协议三、TCP协议
2021-06-06 21:16:59
2797
4
原创 计算机网络---应用层(https、http和https的区别、对称加密、非对称加密、中间人攻击、数据摘要、指纹、公正)
一、https协议https 和http是应用层两个非常重要的协议,使用二、https VS http三、https相关的安全问题
2021-05-30 21:39:48
1057
3
原创 计算机网络---应用层(http协议)
在tcp/ip五层协议模型中,应用层是处于最高层的,主要为应用程序提供服务,我们程序员编写的程序大多数都是运行在应用层的。应用层有很多的协议,主要包括HTTP、DNS、URI、FTP等。一、简单理解序列化和反序列化1、什么是序列化、反序列化协议是一种约定,在socket API中,读写数据都是以字符串的形式进行的,那么要传输一些结构化数据该如何传输呢?例如:传输一个结构体序列化:在传输时,将结构化数据以字符串的形式传输过去。 反序列化:将接收到的字符串在转换成结构化数据。2、网络版计
2021-05-27 21:32:05
2399
7
原创 AVL树
一、AVL树的概念1、什么是AVL树?当数据有序或者接近有序时,使用二叉搜索树进行存储时,得到的二叉搜索树是一颗单支树,其搜索的时间复杂度为O(N)。为了解决上述问题,引入了AVL树的概念:AVL树是一颗特殊的二叉搜索树 向AVL树中插入一个节点后,树的所有节点的左右孩子节点的高度差的绝对值小于等于1. 即AVL树是一颗二叉搜索树是,它的左右子子树的高度之差(平衡因子)的绝对值不大于1,并且它的左右子树也是一颗AVL树。2、AVL树的节点定义template<cla
2021-05-26 23:45:23
13335
13
原创 C++---map和set的使用
一、基础知识1、序列式容器和关联式容器序列式容器:底层是线性数据结构,且存储的是元素本身,称为序列式容器。例如:vector string list deque等。 关联式容器:底层数据结构存储的是<key,value>的键值对,在数据检索时比序列是容器效率更高。2、键值对用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value,key代表键值,value表示与key对应的信息。键值对的定义:template <class T1, cl
2021-05-24 22:02:31
615
1
原创 二叉树相关问题
二叉树的最近公共祖先节点class Solution {public: //前序遍历二叉树 bool prevOrder(TreeNode* root,TreeNode* x,stack<TreeNode*>& path) { if(root == nullptr) return false; //根节点入栈 path.push(root); if(root == x)
2021-05-22 22:02:43
177
原创 二叉树的还原(前序和中序、中序和后序)
根据前序和中序序列还原二叉树class Solution {public: TreeNode* _buildTree(vector<int>& preorder,vector<int>& inorder,int& prevIndex,int inBegin,int inEnd) { if(prevIndex >= preorder.size()) return nullptr;
2021-05-22 20:09:34
444
原创 二叉树的递归和非递归遍历(前序、中序、后序、层序)
二叉树的前序遍历递归class Solution {public: void _preorderTraversal(vector<int>& v,TreeNode* root) { //递归实现 if(root == nullptr) return; v.push_back(root->val); _preorderTraversal(v,root->left)
2021-05-19 17:53:05
169
原创 C++---二叉搜索树
一、二叉搜索树的概念二叉搜索树又称二叉排序树,它是一颗空树或者是具有以下性质的树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值 它的左右子树也分别为二叉搜索树二、二叉搜索树的操作1、查找基本思路:根节点为空,返回false 根节点不为空,比较根节点和要找的值是否相等,相等返回true。 根节点和要找的值不想等时,判断跟节点和要找的值的关系。 如果根节点小于要找到的值,则在右子树找 如果根节点大于要
2021-05-19 15:27:20
709
5
原创 为什么TCP、UDP套接字服务器端需要绑定端口号客户端不需要?
正常情况下,服务器端是一直在运行的,等待客户端发送请求,如果没有客户端发送请求则服务器端处于阻塞状态。 也就是说,服务器端不会主动给客户端发送数据,只有当客户端给服务器端发送请求后服务器端才会给客户端发送数据。 因此,服务器端总是被动运行的,而客户端需要主动运行。 如果不将服务器端的IP地址和端口号绑定到网络,客户端就无法找到该服务器端,无法进行请求。 因为,如果不绑定则会随机给服务器端分配一个端口号和IP地址,客户端也不知道这个端口号和IP地址。因此,需要将服务器端绑定,便于客户端发送请求连接。
2021-05-13 23:19:47
5199
3
原创 网络编程套接字
目录一、IP地址和端口号1、源IP地址和目的IP地址2、端口号1)什么是端口号?2)源端口号和目的端口号3)端口号和进程ID的关系3、示例理解IP地址、进程ID、端口号二、认识TCP、UDP1、TCP2、UDP三、网络字节序1、什么是网络字节序?2、网络字节序和主机字节序转换相关接口四、socket变成一、IP地址和端口号1、源IP地址和目的IP地址IP协议是工作在网络层的协议,负责地址管理和路由选择的。当数据传输到网络层时,会封装IP首部
2021-05-12 20:58:51
1618
14
原创 C++---多态
一、多态的概念1、多态的定义通俗的说,多态就是一个事务的不同形态。即不同的对象完成某个任务的状态。例如,买票时学生票半价,军人优先买票,其他人正常买票。实际上,多态就是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。2、多态的实现1)虚函数使用virtual修饰的类成员函数称为虚函数。class Person {public: virtual void BuyTicket() { cout << "买票-全价" &
2021-05-10 17:23:27
675
9
原创 网络基础(一)
目录一、计算机网络的背景和发展1、网络的发展历程二、初识网络协议1、什么是协议?2、计算机网络体系结构三、网络传输(TCP/IP通信过程)1、同一网段内两台主机间的文件传输2、跨网段的主机文件传输3、数据报的封装和分用4、网络中的地址管理一、计算机网络的背景和发展1、网络的发展历程独立模式:计算机之间是相互独立的,每个终端独自拥有客户数据。 网络互联:多台计算机连接在一起,完成数据的共享。各个终端之间可以自由切换,共享数据由服务器集中管理。 局域网LA
2021-05-08 18:15:59
475
5
原创 算法---动态规划(背包问题、分割回文串)
第9题:背包问题问题分析思路1状态定义:前i个物品中可装入背包的方案的总价值f(i) 状态之间的转换方程:f(i) = {f(1)+V[i],f(2)+V[i],...,f(i-1)+V[i]} 初始状态:f(1) = V[0] (A[0]<=m) 返回结果:max{f(1),f(2),...,f(i)}思路2:优化算法状态定义 状态之间的转换方程 初始状态 返回结果代码描述第10题:分割回文串II题目分析状态定义 状态之间的转移方程 初始状态 返
2021-05-03 12:58:38
516
2
原创 C++---继承
面向对象的三大特征:封装、继承、多态封装:将事务的属性和行为抽象成具体的数据和方法,使用类对数据和方法进行封装,通过权限访问限定符进行限定,使用者无序关注具体实现(隐藏性),只需通过对象调用类中接口。以类为单位进行管理,提高了代码的复用性和可读性。一、继承的概念和定义1、什么是继承?继承是面向对象的特征之一,是提高代码复用的重要手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类称派生类原有的类称为基类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过
2021-04-29 23:11:52
1626
8
原创 C++---模板进阶
目录一、非类型模板参数1、非类型模板参数的介绍2、非类型模板参数的使用二、模板的特化1、模板特化的概念2、函数模板的特化3、类模板的特化三、模板的分离编译1、什么是分离编译2、模板的分离编译四、模板的优点和缺点一、非类型模板参数1、非类型模板参数的介绍模板参数分为类类型模板参数和非类型模板参数。类类型模板参数:出现在模板参数中,跟在class或者typename后面的参数类型名称。 非类型模板参数:用一个常量作为类或者函数模板的一...
2021-04-24 21:24:14
2823
5
原创 Linux---线程的同步和互斥
目录1、线程的互斥2、可重入VS线程安全3、线程的同步1、线程的互斥1)线程互斥的相关概念临界资源:被多个执行流共享的资源就称为临界资源,例如全局变量。 临界区:访问临界资源的代码称为临界区。 互斥:互斥保证了任何时刻只有一个线程进入临界区访问临界资源。 原子性:不会被任何机制打断的操作,该操作只有两态,要么已经完成要么还没开始(不能存在已经开始了,但是还没完成的情况,简单理解就是依据汇编代码就可以实现的)。2)通过订票示例引入互斥量#include<stdi
2021-04-21 16:53:06
1495
3
原创 Linux---线程控制
目录1、创建线程2、线程终止3、线程等待4、线程分离Linux下线程是使用进程模拟实现的,因此没有专门的系统调用来进行线程的各种操作(创建、终止等),Linux下线程控制都是通过POSIX线程库完成的。1、创建线程1)使用第三方库创建线程int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg); ...
2021-04-21 16:51:20
367
原创 linux---线程概念
目录1、什么是线程?2、线程的优缺点3、线程异常、线程用途、4、Linux线程和进程的比较1、什么是线程?线程是一个进程内部的控制序列,在一个程序里的一条执行路线就叫做线程。所有的进程都至少有一个执行线程,线程在进程内部本质是在进程地址空间上运行(所有线程同时使用该进程的程序地址空间,只不过每个线程都有自己的执行流)。线程透过进程地址空间可以看到进程的大部分资源,将进程资源合理分配给每个执行流就形成了线程执行流。在Linux系统中,线程是用进程来模拟实现的,也就是说Linux中线程没
2021-04-21 16:50:05
254
原创 C++---stack & queue & 适配器模式 & 优先级队列 & 仿函数
一、容器适配器1、什么是适配器?设计模式(Design pattern):设计模式代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案,是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。 容器适配器:适配器是一种设计模式,该种模式是将一个类的接口转换成客户希望的另外一个接口。简单理解为一个类的底层实现调用了另一个类提供的接口。二
2021-04-17 17:28:06
769
原创 Linux---生产者消费者模型、信号量、基于环形队列的生产者消费者模型、线程池
一、线程概念1、什么是线程?2、线程的优缺点3、线程异常、线程用途4、Linux线程和进程的比较二、Linux线程控制1、创建线程一、线程概念1、什么是线程?线程是一个进程内部的控制序列,在一个程序里的一跳执行路线就叫做线程。所有的进程都至少有一个执行线程,线程在进程内部本质是在进程地址空间上运行(所有线程同时使用该进程的程序地址空间,只不过每个线程都有自己的执行流)。线程透过进程地址空间可以看到进程的大部分资源,将进程资源合理分配给每个执行流就形成了线程执行流。在.
2021-04-15 16:49:44
717
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人