自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 STL简介

STL(Standard Template Library),即标准模板库。该库提供了常用的数据结构和算法。STL三种基本组件:1、容器(container):容器是容纳、包含一组元素的对象。容器类库包括7种基本容器:向量(vector)、双端队列(deque)、列表(list)、集合(set)、多重集合(multiset)、映射(map)和多重映射(multimap)。其中容器又分为顺序...

2019-09-05 18:51:37 566 1

原创 容器容量和容器大小(capacity和size)

(1)容器容量:容器所能容纳元素的个数,通常大于容器的实际存储元素的个数。s.capacity();//查看容器容量s.reserve(len);//扩展当前容器的容量,如果len大于当前容器容量,那么将会将容器的容量扩展为len,且不会对新扩展的空间进行初始化;当len小于等于当前容器容量时,什么也不做。(2)容器大小:容器中当前存在元素的个数。s.size();//查看当前...

2019-09-03 12:56:47 5978

原创 vector和deque的区别

(1)vector的底层实现时数组;而deque的底层实现时“中央控制区”和缓冲的结构。 (2)vector的内存空间时连续的;而deque的内存空间是一种假的连续,实际上是不连续的。 (3)vecotr的支持数组的随机访问;而deque虽然也是支持使用[]的运算符,但实际上是需要通过中央控制器二次寻址的,效率比vector略低。 (4)vector在空间不够重新申请新空间策略是先申请一块比...

2019-09-03 12:52:46 2332

原创 vector和list的区别

(1)vector的底层实现是数组;而list的底层实现是双向链表。 (2)vector的内存的空间时连续的;而list的内存空间时不连续的。 (3)vector支持数据的随机访问;而list不支持数据的随机访问。 (4)vector在插入时如果空间不够才会自动申请新的空间的扩容,但容器中数据删除时不会释放空间;而list在每次插入和删除都会申请和释放空间。 (5)vector在数据的插入...

2019-09-03 12:50:54 444

原创 c++中的四种cast转化

1、const_cast(常量转化)用于将const变量转化为非const。这里需要注意:如果一个变量被定义为const,通过const_cast转化函数转化后,这个值还是不能改变的。这里我们需要记住一句话:const_cast不是为了改变const变量的值而设计的,在函数参数的传递上const_cast的作用才显示出来。void fun(int* n){ cout <&l...

2019-09-03 11:46:22 242

原创 虚拟内存

虚拟内存是内存管理的一种方式,主要是为了解决“大作业”无法同时装入内存的问题。它将多个物理内存碎片和部分磁盘空间重定向为连续的地址空间,以此让程序认为自己拥有连续的可用内存,当物理内存不足时,操作系统会根据页面置换算法将程序需要的数据交换到内存中。虚拟地址空间:在程序运行时,操作系统(linux系统)会为每个进程分配一个4g的虚拟地址空间,其中0-3g为用户空间,3-4g为内核空间而3-4...

2019-09-03 11:39:11 223 1

原创 虚函数继承与虚继承

虚函数继承和虚继承是完全不同的两个概念。虚函数继承是解决多态性的,当用基类指针指向派生类对象的时候,基类指针调用虚函数的时候会自动调用派生类的虚函数,这就是多态性,也叫动态编联。虚继承就是为了节约内存,他是多重继承中的特有的概念。适用于菱形继承形式。比如B继承于A、C继承于A、D继承于B和C,显然D会继承两次A(图1)。因此,为了节省空间,可以将B、C对A的继承定义为虚拟继承,而A就成...

2019-09-03 11:09:35 719

原创 虚函数(virtual)

虚函数(virtual)上面提到动态多态主要通过虚函数机制实现,这里介绍以下虚函数。和普通的函数声明方式相同,只要在函数的返回值前加上virtual关键字,该函数就为虚函数,即virtual 函数类型 函数名(形式参数)虚函数的作用:允许通过基类的指针或引用来访问基类和派生类的同名函数。1、虚成员函数#include <iostream>using namespac...

2019-09-03 11:01:03 4242

原创 重载、重写(覆盖)和隐藏

1、重载:是指在同一访问区内(同一个类)被声明的具有不同参数列表的同名函数,在函数调用时可以通过参数列表来确定调用的对象,重载不关心函数的返回值类型。即同一类中,同名不同参。参数列表不同主要表现在以下几个方面:(1)参数的个数不同 (2)参数顺序不同 (3)参数类型不同这里需要注意函数返回值类型的不同,并不是重载。但函数声明为const是可以被认定为重载的。const对象只能调用co...

2019-09-03 10:52:54 294

原创 封装、继承、多态

封装、继承和多态1、封装封装是面向对象方法的重要原则,就是把对象的属性和服务结合成一个独立的系统单位,并且尽可能隐藏对象的内部细节。结合到c++中,这个独立的系统单位就是类,类需要有高聚合和低耦合性,即内部的属性和服务尽可能的联系紧密,而对外部只提供一些必要的接口。让使用的人不必清除类内部是如何实现的。2、继承继承是面向对象技术能够提高软件开发的重要原因之一。通过继承可以实现“代码...

2019-09-03 10:46:02 477

原创 观察者模式

目录导读目录观察者模式 简介模式结构观察者模式的优点:观察者模式的缺点:代码实现观察者模式 简介当对象存在一对多的关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它依赖对象。观察者模式属于行为型模式,又被称为发布-订阅模式、模式-视图模式、源-监听器模式或从属者模式。观察者模式中分为目标和观察者,目标可以被多个观...

2019-09-03 10:32:34 130

原创 工厂模式

工厂模式简介工厂模式解决的问题是:接口选择问题,即让对象自己决定调用什么构造函数来实例化自己,对象本身并不关心该构造函数是什么工厂模式分类目录简单工厂模式工厂方法模式抽象工厂模式简单工厂模式、工厂方法模式和抽象工厂模式的对比简单工厂模式简单工厂模式是工厂模式中最简单的一种,它使用了最简单的方式隐藏了创建对象的细节,一般需要告诉工厂类所需要的类型,工厂类就会调用相应的...

2019-08-31 16:31:50 111

原创 C++的 static 关键字的作用

1)static 修饰全局变量和局部变量全局变量属于数据,不是放在.data 段,就是在.bss,如果是常量字符串的话,就放在.rodata 段,看看一个普通全局变量和 static 全局变量有什么区别?全局变量 gdata1 是“g”代表 global 符号,在链接阶段其他的obj 文件是可以看到的,这样的符号是要参与链接过程符号解析的;gdata2 是“l”代表一个local 本地符号...

2019-08-31 15:25:35 106

原创 C++拷贝构造函数详解

一. 什么是拷贝构造函数首先对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a = 100;int b = a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。下面看一个类对象拷贝的简单例子。 //构造函数  CExample(int b)  { a = b;} //一般函数  voi...

2019-08-31 14:51:01 113

原创 this指针详解

this指针在建立对象时,系统会为每一个对象分配独立的存储空间,也就是给每个对象中的数据成员都分配有自己独立的存储空间。如果对同一个类定义n个对象,则有n组同样大小的空间以存放对象中的数据成员。但对于成员函数来说,对象中的数据成员。一个函数的代码段在内存中只有一份。也就是说,函数的代码段在内存中只有一份。也就是说,同一个类中的不同对象在调用自己的成员函数时,一个类中的不同对象在调用自己的成员函...

2019-08-31 14:19:55 285

原创 post和get的区别

Get和Post在面试中一般都会问到,一般的区别:post更安全(不会作为url的一部分,不会被缓存、保存在服务器日志、以及浏览器浏览记录中) post发送的数据更大(get有url长度限制) post能发送更多的数据类型(get只能发送ASCII字符) post比get慢 post用于修改和写入数据,get一般用于搜索排序和筛选之类的操作(淘宝,支付宝的搜索查询都是get提交...

2019-08-31 12:34:03 108

原创 STL四种智能指针(又名小智买房记)

STL 一共给我们提供了四种智能指针:auto_ptr、unique_ptr、shared_ptr 和 weak_ptr,auto_ptr 是 C++98 提供的解决方案,C+11 已将其摒弃,并提出了 unique_ptr 作为 auto_ptr 替代方案。虽然 auto_ptr 已被摒弃,但在实际项目中仍可使用,但建议使用较新的 unique_ptr,因为 unique_ptr 比 auto_ptr 更加安全,后文会详细叙述。shared_ptr 和 weak_ptr 则是 C+11 从准标准库 Boo

2019-08-31 11:03:28 191

原创 使括号有效的最少添加

给定一个由'('和')'括号组成的字符串 S,我们需要添加最少的括号( '('或是')',可以在任何位置),以使得到的括号字符串有效。从形式上讲,只有满足下面几点之一,括号字符串才是有效的:它是一个空字符串,或者它可以被写成AB(A与B连接), 其中A 和B都是有效字符串,或者它可以被写作(A),其中A是有效字符串。给定一个括号字符串,返回为使结果字...

2019-08-29 18:41:02 295

原创 简单的可靠udp的实现(RUDP)

可靠的概念在实时通信过程中,不同的需求场景对可靠的需求是不一样的,我们在这里总体归纳为三类定义: 尽力可靠:通信的接收方要求发送方的数据尽量完整到达,但业务本身的数据是可以允许缺失的。例如:音视频数据、幂等性状态数据。 无序可靠:通信的接收方要求发送方的数据必须完整到达,但可以不管到达先后顺序。例如:文件传输、白板书写、图形实时绘制数据、日志型追加数据等。 有序可靠:通信接收...

2019-08-25 19:20:37 1523

原创 TCP 与 UDP 区别

1) TCP 特点:面向连接的、可靠的、流式服务TCP面向连接(如打电话要先拨号建立连接); TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达; TCP通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。 每一条TCP连接只能是点到点的; TCP对系统资源要求较多2) ...

2019-08-25 18:37:05 108

原创 TCP 服务器客户端编程流程

客户端调用序列调用socket函数创建套接字 调用connect连接服务端 调用I/O函数(accept/recv)与服务器端通讯 调用close关闭套接字服务器端调用序列调用socket函数创建本地套接字 调用bind函数绑定本地地址和端口 调用listen启动监听 调用accept从已经连接的队列中提出客户连接 调用I/O函数(accept/recv)与客户端通讯 调...

2019-08-25 18:25:55 1238

原创 在排序数组中查找元素的第一个和最后一个位置

给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。你的算法时间复杂度必须是O(log n) 级别。如果数组中不存在目标值,返回[-1, -1]。示例 1:输入: nums = [5,7,7,8,8,10], target = 8输出: [3,4]示例2:输入: nums = [5,7,7,8,8,10],...

2019-08-25 15:52:31 79

原创 安排工作以达到最大收益

有一些工作:difficulty[i]表示第i个工作的难度,profit[i]表示第i个工作的收益。现在我们有一些工人。worker[i]是第i个工人的能力,即该工人只能完成难度小于等于worker[i]的工作。每一个工人都最多只能安排一个工作,但是一个工作可以完成多次。举个例子,如果3个工人都尝试完成一份报酬为1的同样工作,那么总收益为 $3。如果一个工人不能完成任何工作,他的收益...

2019-08-25 14:23:55 145

原创 等差数列划分

如果一个数列至少有三个元素,并且任意两个相邻元素之差相同,则称该数列为等差数列。例如,以下数列为等差数列:1, 3, 5, 7, 97, 7, 7, 73, -1, -5, -9以下数列不是等差数列。1, 1, 2, 5, 7数组 A 包含 N 个数,且索引从0开始。数组 A 的一个子数组划分为数组 (P, Q),P 与 Q 是整数且满足 0<=P<Q&...

2019-08-24 13:57:24 230

原创 宝石与石头

给定字符串J代表石头中宝石的类型,和字符串S代表你拥有的石头。S中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。J中的字母不重复,J和S中的所有字符都是字母。字母区分大小写,因此"a"和"A"是不同类型的石头。示例 1:输入: J = "aA", S = "aAAbbbb"输出: 3示例 2:输入: J = "z", S = "ZZ"...

2019-08-23 14:57:44 80

原创 二叉树的所有路径

给定一个二叉树,返回所有从根节点到叶子节点的路径。说明:叶子节点是指没有子节点的节点。示例:输入: 1/ \2 3\ 5输出: ["1->2->5", "1->3"]解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3来源:力扣(LeetCode)链接:https://leetcode-...

2019-08-23 14:34:25 128

原创 在二叉树中分配硬币

给定一个有 N 个结点的二叉树的根结点 root,树中的每个结点上都对应有 node.val 枚硬币,并且总共有 N 枚硬币。在一次移动中,我们可以选择两个相邻的结点,然后将一枚硬币从其中一个结点移动到另一个结点。(移动可以是从父结点到子结点,或者从子结点移动到父结点。)。返回使每个结点上只有一枚硬币所需的移动次数。来源:力扣(LeetCode)链接:https://leetcode...

2019-08-23 14:06:26 238

原创 复写零

给你一个长度固定的整数数组arr,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。注意:请不要在超过该数组长度的位置写入元素。要求:请对输入的数组就地进行上述修改,不要从函数返回任何东西。示例 1:输入:[1,0,2,3,0,4,5,0]输出:null解释:调用函数后,输入的数组将被修改为:[1,0,0,2,3,0,0,4]示例 2:输入:[1,2,3...

2019-08-23 13:38:07 260

原创 c中已经有了malloc和free,为什么c++中会用new和delete?

要了解这个问题我们先需要了解它们的区别相同点:都会从堆上申请空间,用户需要自己来管理。不同点:1.所属语言new是C++特性,malloc是C的。C++一般使用的new,但也可以使用malloc,而C用malloc、realloc、calloc。2.申请释放方式new和delete,malloc和free配对使用。new的使用比malloc简单,内部已经实现了大小的计算、类型转换...

2019-08-22 17:54:39 968

原创 IP地址和MAC地址

MAC地址是一个48位的硬件地址,该地址和设备是匹配的,每台机器都有一个唯一的MAC地址,用来定义网络设备的位置,主要由数据链路层负责。MAC地址的作用是为唯一的标识一台主机,用于局域网内的通信,类似于身份证号。IP地址是一个32/128位的网络地址,由于目前使用的IPV4,所以全球的IP地址是不够分配的,所以IP地址采用的是动态分配的方式。IP地址的主要作用是寻找局域网,在网络层工作,如果不...

2019-08-21 14:01:55 285

原创 OSI七层模型和TCP/IP层模型 以及对应的常见协议

OSI七层模型包括(从下到上):物理层、数据链路层、网络层、运输层、会话层、表示层、应用层。TCP/IP四层模型(从下到上):网络接口层、网络层、运输层、应用层OSI七层模型 常见协议 TCP/IP四层模型 常见协议 应用层 FTP、HTTP、DNS 应用层 FTP、HTTP、DNS 表示层 JPEG、ASII 会话层 RPC、N...

2019-08-21 13:59:16 666

原创 线程同步方法有哪些?

(1)互斥锁允许程序员锁住某个对象,使得每次只能有一个线程访问他。为了控制关键代码的访问,必须在进入这段代码之前锁住一个互斥量,然后再完成操作之后解锁它。用于互斥锁的基本函数:#include<stdio.h>int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutexattr_t *mutexatt...

2019-08-21 13:30:57 357

原创 进程间通信有哪几种方式?

进程间通信有以下几种管道:管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道; 匿名管道只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程); 单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在于内存中。 无名管道(pipe):管道是一种半双工的通...

2019-08-21 12:49:22 1200

原创 复制进程 fork ()&写实拷贝&僵死进程

简述 fork 复制进程的流程,并说明什么是写时拷贝

2019-08-19 15:32:57 236

原创 中断和异常

异常当cpu在执行运行在用户态下的程序时,发生了一些没有预知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关进程中,也就是切换到了内核态,如缺页异常。外围设备的中断当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令而转到与中断信号对应的处理程序去执行,如果前面执行的指令时用户态下的程序,那么转换的过程自然就会是 由用户态到...

2019-08-19 13:18:28 1036

原创 系统调用

系统调用由操作系统实现提供的所有系统调用所构成的集合即程序接口或应用编程接口(Application Programming Interface,API)。是应用程序同系统之间的接口。系统调用接口系统功能调用是操作系统提供给程序设计人员的一种服务。程序设计人员在编写程序时,可以利用系统调用来请求操作系统的服务。目的:方便用户使用。系统调用 和函数调用的区别系统调用1.使用...

2019-08-19 12:48:29 141

原创 linux 环境下 main 函数有几个参数,并说明各个参数的意义

关于c语言里的main函数一般有两个参数int argc,char * argv[ ];main 函数的参数也叫做命令参数,顾名思义就是在linux或者windows的dos下面敲命令的时候就有用了。argv指的是 char * argc[]的大小char * argc[]是一个指针数组,里面存放的是char *类型的指针argc[0]表示自身运行目录路径和程序...

2019-08-18 21:58:58 947 1

原创 用户态和内核态的区别

在计算机系统中,通常运行着两种程序————系统程序和应用程序,为了保证整系统程序不被应用程序所破坏,系统设置了两种状态1)内核态,操作系统在系统态运行———运行操作系统程序。2)用户态,应用程序只能在用户态运行———运行用户程序。运行过程中处理机会在用户态和内核态来回切换,由此相应的现代操作系统将CPU指令也划分为两类,特权指令和非特权指令。特权指令(在内核态运行的指令)1)对...

2019-08-18 21:37:55 243

原创 进程和线程

进程说到进程就不得不提下操作系统的调度大部分操作系统(如Windows、Linux)的任务调度是采用时间片轮转的抢占式调度方式。也就是说一个任务执行一小段时间后强制暂停去执行下一个任务,每个任务轮流执行。任务执行的一小段时间叫做时间片,任务正在执行时的状态叫运行状态,任务执行一段时间后强制暂停去执行下一个任务,被暂停的任务就处于就绪状态,等待下一个属于它的时间片的到来。这样每个任务都能得到...

2019-08-18 18:04:35 204

原创 如何避免死锁(X)如何防止你处于恋爱的三角关系中(V)

死锁的概念:多个进程或线程访问一组竟态资源的时候,出现的永久阻塞的问题。产生的原因主要有三个:系统资源不足,程序运行推进的顺序不当,资源分配不当。产生的四个条件是:(括号里的内容只是帮大家巧记,与作者本人无关,大家看个开心就好)1) 互斥某种资源一次只允许一个进程访问,一旦资源被某个进程访问,其他进程就不能访问该资源,知道访问结束。(其实产生死锁的条件就和谈恋爱一样,一旦两个...

2019-08-18 16:08:50 168

空空如也

空空如也

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

TA关注的人

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