自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C++的类型转换

C语言中的类型转换 在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化,C语言中总共有两种形式的类型转换: 隐式类型转换 编译器在编译阶段自动进行,能转就转,不能转就编译失败 显式类型转换 需要用户自己处理 void Test (){ int i = 1; // 隐式类型转换 double d = i; printf("%d, %.2f\n" , i, d); int* p =

2021-08-22 20:52:12 113

原创 C++智能指针

内存泄漏什么是内存泄漏,内存泄漏的危害? 什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。 内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。 内存泄漏分类C/C++程序中一般我们关心两种方面的内存泄漏: 堆内存泄漏(Heap leak) 堆

2021-08-22 15:53:11 112

原创 C++异常

C语言传统的处理错误的方式传统的错误处理机制: 终止程序,如assert,缺陷:用户难以接受。如发生内存错误,除0错误时就会终止程序。 返回错误码,缺陷:需要程序员自己去查找对应的错误。如系统的很多库的接口函数都是通过把错误码放到errno中,表示错误 C 标准库中setjmp和longjmp组合。这个不是很常用,了解一下 实际中C语言基本都是使用返回错误码的方式处理错误,部分情况下使用终止程序处理非常严重的错误。C++异常概念异常是一种处理错误的方式,当一个函数发现自己

2021-08-22 15:10:02 115

原创 哈希的应用

哈希是查询效率最高的算法,那么它有哪些应用呢?最常见的应用就是位图了!位图:位图概念 所谓位图,就是用每一位来存放某种状态,适用于海量数据,数据无重复的场景。通常是用来判断某个数据存不存在的。 数据是否在给定的整形数据中,结果是在或者不在,刚好是两种状态,那么可以使用一个二进制比特位来代表数据是否存在的信息,如果二进制比特位为1,代表存在,为0代表不存在。比如: 位图的应用 快速查找某个数据是否在一个集合中 排序 求两个集合的交集、并集等 操作系统中磁盘块标

2021-08-21 17:56:04 366

原创 哈希的概念

unordered系列关联式容器在C++98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到,即最差情况下需要比较红黑树的高度次,当树中的节点非常多时,查询效率也不理想。最好的查询是,进行很少的比较次数就能够将元素找到,因此在C++11中,STL又提供了4个unordered系列的关联式容器,这四个容器与红黑树结构的关联式容器使用方式基本类似,只是其底层结构不同。unordered_mapunordered_map是存储<key, value>键值

2021-08-21 16:43:03 158

原创 AVL树and红黑树

二叉搜索树有其自身的缺陷,假如往树中插入的元素有序或者接近有序,二叉搜索树就会退化成单支树,时间复杂度会退化成O(N),因此map、set等关联式容器的底层结构是对二叉树进行了平衡处理,即采用平衡树来实现。AVL 树AVL树的概念 二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。因此,两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年发明了一种解决上述问题的方法:.

2021-08-20 22:04:09 73

原创 map和set

关联式容器在之前的文章中,我们已经接触过STL中的部分容器,比如:vector、list、deque、forward_list(C++11)等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。那什么是关联式容器?它与序列式容器有什么区别?关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是<key, value>结构的键值对,在数据检索时比序列式容器效率更高。在说关联式容器之前,我们要先说说什么是键值对!键值对用来表示具有一一.

2021-08-20 21:16:56 172

原创 二叉搜索树

二叉搜索树概念:二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值 它的左右子树也分别为二叉搜索树二叉搜索树操作:二叉搜索树的查找 二叉搜索树的插入 树为空,则直接插入 if (nullptr == root){ root = new Node(data); return true...

2021-08-20 16:48:46 98

原创 论一论多态

多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同 的状态。 举个栗子来说:比如买票这个行为,当普通人买票时,是全价买票;学生买票时,是半价买票;军人买票时是优先买票。 多态的定义:多态的构成条件 多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。 Person对象买票全价,Student对象买票半价。 必须通过基类的指针或者引用调用虚函数 被调用的函数必须是虚函

2021-08-19 21:51:07 69

原创 C++中的继承(下)

我们前面说了很多的继承相关的知识,那么基类中又那些成员能继承到子类中呢?基类包含: 成员变量: 普通成员变量 静态成员变量 成员函数: 普通成员函数 静态成员函数 默认成员函数: 构造、拷贝构造、赋值运算符重载、析构函数 可以继承的成员: 普通成员变量可以继承到子类中 静态成员变量: 也被子类继承,并且在整个继承体系中只有一份普通成员函数也继承到子类中 静态成员函数也被子类继承了,并且可以通过 子类::静态成员函数()调用 .

2021-08-19 20:07:00 73

原创 C++中的继承(上)

继承继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。 ...

2021-08-19 17:17:34 99

原创 C++的IO流

C语言的输入与输出:C语言中我们用到的最频繁的输入输出方式就是scanf()与printf()。 scanf(): 从标准输入设备(键盘)读取数据,并将值存放在变量中。 printf(): 将指定的文字/字符串输出到标准输出设备(屏幕)。 注意宽度输出和精度输出控制。C语言借助了相应的缓冲区来进行输入与输出。那么,流是什么?“流”即是流动的意思,是物质从一处向另一处流动的过程,是对一种有序连续且具有方向性的数据( 其单位可以是bit,byte,packet )的抽象描述。 C++.

2021-08-19 15:26:44 55

原创 stack(栈)和queue(队列)

stack:stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。 stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。 stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下操作: empty:判空操作 back:获取尾部元素操作 push_back

2021-08-18 22:02:19 92

原创 list容器

list的介绍list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。 list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。 list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。 与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。 与其他序列式

2021-08-18 15:55:20 80

原创 vector

vector的介绍vector是表示可变大小数组的序列容器。 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。 本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到

2021-08-17 17:19:30 61

原创 string类

为什么学习string类? C语言中的字符串 C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且层空间需要用户自己管理,稍不留神可能还会越界访问。 string类字符串是表示字符序列的类 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作单字节字符字符串的设计特性。 string类是使用char(即作为它的字符类型,使用它的默认c

2021-08-17 16:03:56 60

原创 STL简介

什么是STL?STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。STL的六大组件STL要解决的问题STL库的更新太慢了。这个得严重吐槽,上一版靠谱是C++98,中间的C++03基本一些修订。C++11出来已经相隔了13年,STL才进一步更新。 STL现在都没有支持线程安全。并发环境下需要我们自己加锁。且锁的粒度是比较大的。 STL极度的追求效

2021-08-17 14:19:43 150

原创 说说函数模板

如何实现一个通用的交换函数呢? 使用函数重载虽然可以实现,但是有一下几个不好的地方: 重载的函数仅仅只是类型不同,代码的复用率比较低,只要有新类型出现时,就需要增加对应的函数 代码的可维护性比较低,一个出错可能所有的重载均出错 那能否告诉编译器一个模子,让编译器根据不同的类型利用该模子来生成代码呢?函数模板:函数模板概念 函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。 函数模板格式 templa

2021-08-17 13:21:44 58

原创 动态内存管理

什么是动态内存?用户自己申请的内容空间并且用完之后需要动态进行释放的空间 动态: 用户申请由用户释放为什么需要进行动态内存申请呢?在内存不同的区域存放不同的是不同的数 而用户数据能够存储的位置: 栈 堆 用户的数据可能非常大,在栈区中存储补下,因此需要更大的内存空间类存储用户的数据更大的内存空间用户需要向操作系统来进行获取 栈空间(函数运行时的栈帧,随函数运行而创建,随函数结束而回收,回收之后,函数中局部变量的数据就没有意义了, 但是有些情况下,我们需要将程序运行期间产生的数据带出函数..

2021-08-16 21:21:38 78

原创 类与对象简述

什么是类?类是对一个相同群体来进行描述的,描述对象都具有那些属性(成员变量),描述对象都具有那些功能(成员函数) 在C++中,定义一个类时,就相当于定义了一个类型,也定义了一个新的作用域 类相当于是一张图纸,在图纸上涉及房子的样式,(类是不占用空间的,而用类定义出来的对象是"占用空间"的,即: 数据是不能放到类中,只能存储到用类定义出来的对象中)什么是对象?对象是实实在在存在的,是类的一种具体的体现,是用类类型定义出来的一个变量,数据最终都是放在对象中的 对象: 相当于是用图纸建造出来的房子

2021-08-16 17:32:33 105

原创 类初始化(C++)

语法:初始化列表完成的是对类"成员变量"初始化工作,而构造函数函数体中是赋值操作 成员变量在初始化列表中只能出现一次,真正的初始化次序是按照成员变量在类中声明的次序进行初始化 尽量避免使用成员来初始化成员 必须在初始化列表位置初始化的成员 const类型的成员 引用类型的成员 类类型对象(并且类类型对象具有无参的构造函数&&没有无参和全缺省的构造函数) 注意:初始化列表是构造函数的特性 用户没有显式给出时,初始化列表仍旧存在,只不过编译器会对成员变量进行默认的初

2021-08-16 15:19:27 1770

原创 典型IO类型(下)

poll多路转接IO模型:地位: 地位不如select,因为select可以跨平台, 性能是不如后面学到的epoll,因为epoll底层是红黑树。 接口:

2021-08-12 21:48:10 83

原创 典型IO模型(中)

多路转接IO:多路转接IO,牛逼的地方在于可以监控多个文件描述符,判断多个描述符是否准备就绪 多路转接lO模型: select, poll, epoll ==》 高并发的基础

2021-08-12 18:36:39 53

原创 典型IO模型(上)

什么是IO?IO就是input和output IO的过程: 等待IO就绪,等待资源就绪(等待资源可用)     recv(fd, buf, bufsize, 0)    read(fd, buf, bufsize, 0)拷贝数据到缓冲区当中五种IO模型:    阻塞IO 非阻塞IO 信号驱动IO 多路转IO 异步IO阻塞IO:介绍:在资源不可用的情况下,IO请求一直被阻塞, 直到资源可用例子: 当钓鱼的时候,将鱼钩甩入水中,眼睛一直看着鱼漂,直到鱼漂沉下去, 再将.

2021-08-11 16:57:32 47

原创 其他重要协议(NAT/DNS)

解决地址枯竭问题的:DHCP协议, 谁上网给谁分配ip NAT协议 大boss: ipv6, 问题就是不兼容ipv4NAT协议:NAT是地址转换协议,工作在私网网络的出口位置 私网到公网 请求: 将五元组当中的源ip地址(私网ip地址),转换成为公网ip 应答: 将五元组当中的目的ip地址(公网ip地址) , 转换成为私网ip NAT服务器将网络划分成为了公网(以太网)和私网 NAT服务器为双方数据传输进行保障,保障就是转换ip 对于私网当中的机器,并不需要关心NAT是..

2021-08-11 15:34:20 209

原创 数据链路层

数据链路层:负责相邻设备之间的传输 MAC地址 uint128_ t => ether 00:0c:29:b2:ae: 6a以太网协议目的地址: 目的MAC地址 源地址: 源MAC地址 类型: 指的是上层使用什么协议 数据: 有效载荷 eg: ip数据为例 ip_ h+tcp_ h+应用层数据 ...

2021-08-11 13:49:06 40

原创 子网掩码(CLDR)

在现实世界里,大多数的组织都会申请B类网络地址,导致B类地址很快就分配完了,然而A类地址却浪费了大量地址。针对这种情况,提出了子网掩码划分方案(CLDR)CLDR引入子网掩码, 子网掩码也是一个uint32_ t的整数。 但是子网掩码赋值方式,是从最高为的比特位开始依次向下给比特位赋值1; eg : netmask 255. 255.255.0 111111111111111...

2021-08-11 13:06:21 1590

原创 网络层之IP协议(ipv4)

ip协议字段网络层是负责地址管理和路由转发的,换句话说,和ip地址是强相关滴 网络链路当中的每一个路由器和交换机都会进行分用得到数据链路层的目的MAC地址和网络层的目的IP地址 引申出来,我们在socket编程的时候为什么需要对IP和端口进行主机字节序转换成网络字节序4位版本:指的是ip协议的版本4位首部长度:指的是ip协议报头的长度 4个比特位计算出来的是数值,需要乘以4, 才表示ip协议报头的长度 报头的长度= 4个比特位计算出来的数值* 4,单位字节 ...

2021-08-11 10:15:12 1392

原创 TCP机制2

拥塞控制机制 慢启动,拥塞避免,快重传,快恢复,延时应答慢启动:核心思想:当双方建立连接之后, 开始不要发送大量的数据, 而是先发送少量的数据, 探测网络拥塞程度 拥塞窗口: cwnd 慢开始门限:是一个阈值,ssthresh 当拥塞窗口大小小于慢开始门限的时候, 执行慢开始算法; 当拥塞窗口大小大于慢开始门限的时候, 则执行拥塞避免算法;拥塞窗口: 一...

2021-08-10 17:39:53 87

原创 TCP机制1

TCP是有发送缓冲区和接受缓冲区的结论:所有发送和接收的数据都是需要经过TCP的缓冲区 应用层: send 123 abc 传输层:[发送缓冲区] : 123abc 对于传输层的TCP协议,并不是按照应用层递交数据的顺序(应用层包序)来向网络层递交数 据的;确认应答机制发送方发送一个数据,接收方进行确认 要完成一个完整的数据传输,网络链路当中需要有两个数据包 一个是:发送的数据包 一...

2021-08-10 16:18:09 47

原创 TCP三次握手、四次挥手

包序管理:TCP连接双方总共维护两套序号,客户端维护一套,服务端维护一套 客户端在发送给数据的时候,消耗的是客户端维护的序号,在回复ACK的时候,是确认服务端的序号 服务端你在发送数据的时候,消耗的是服务端维护的序号,在回复ACK的时候,是确认客户端的序号 纯ACK数据包是不消耗序号的三次握手四次挥手FIN:断开连接报文MSL:报文最大生存时间2MSL:丢失的ACK的MSL报文 + 重传的FIN报文...

2021-08-10 14:39:19 118

原创 网络基础TCP

认识TCP协议:(全称为“传输控制协议”)传输层协议 有链接 可靠传输 面向字节流TCP编程流程tcp监听:意义: 当调用监听之后, 意味着告诉操作系统, 当前进程可以接收新的TCP连接了,换句话说,告诉操作系统, 当前进程可以开始接收客户端的三次握手请求了; 意义:三次握手是网络协议栈完成的,和应用层程序没有半毛钱关系 接口 int listen(int sockfd, int backlog) : ...

2021-08-10 10:59:57 163

原创 带文件存储的通讯录

***在***上一篇文章中,我们实现了动态存储的功能,提升了内存空间的利用率。但是,对于通讯录的数据没有保存功能,这就意味着,我们只能在当前程序中查找到其中的数据,当结束该程序后, 通讯录中的所有数据也就丢失了,再次运行程序,就是一个空通讯录。***显***然,这在实际中应用有着不便,我们希望当我们第一次结束程序时,它其中所包含的数据保存住,当我们第二次运行程序时,可以调用到第一次中的数据。***那***么,接下来就朝这个目标来实现。既然要保存,那么,我们首先就得创建一个文件,来进行保存操作。v

2020-05-27 14:31:39 704

原创 动态存储通讯录

在上一篇文章中,介绍了静态存储通讯录的方式,考虑到它在实际运用中存在的问题,接下来就在原有的基础上进行改造。首先,我们思考,当我们想要动态进行存储时,那么我们就得动态开辟空间,既然是可以变化的空间,那么我们就得有一个判断有效元素个数与空间容量的比较,当有效元素个数达到空间容量时,就得进行扩容操作。静态时通讯录结构体为typedef struct Contact{ Peoinfo data[MAX]; int sz;}Contact;基于以上分析,需加入一个新的变量来记录空间容量大小

2020-05-27 13:25:36 1636

原创 静态存储通讯录

基本要求:通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址实现功能:添加联系人信息删除指定联系人信息查找指定联系人信息修改指定联系人信息显示所有联系人信息清空所有联系人以名字排序所有联系人程序代码test.c//引头文件#include"contact.h"void menu(){ printf("***************************************\n"); printf("******1. add

2020-05-10 17:15:10 305

原创 浅谈memcpy函数

memcpy函数形式为void * memcpy(void * destination, const void * source, size_t count)头文件C语言:#include<string.h>C++: #include<cstring>功能从源source所指的内存地址的起始位置开始拷贝count个字节到目标destin所指的内存地址的起始位置中。特点函数memcpy从source的位置开始向后复制num个字节的数据到destination的

2020-05-09 10:42:17 637

原创 浅谈原、反、补码

但凡接触计算机相关知识的朋友们,应该都碰到过原码、反码、补码这三兄弟。那么接下来就简单的介绍一下他们的性格特点。(一)总括计算机中的有符号数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位三种表示方法各不相同。(二)原码是最简单的机器数表示法。用最高位表示符号位,‘1’表示负号,‘0’表示正号。其他位存放该数的二进制的绝对值。例如:+1的原码是:0000 0001,-1的原码是1000 0001。对于原码来说,由于第一位

2020-05-09 10:25:33 385

原创 邂逅c

生活中很多第一次都不容易,第一次写博客,思绪良久,不知如何开头,就简单的记录一些吧。我是一名在读的学生,其实在之前的认知里,从来没有想过自己可能会接触到电脑编程这一方面,但是呢,现在既然选择了,就得风雨同行了,既来之则安之嘛。作为一名电脑小白,感觉还是挺有压力的,但愿自己能把压力转为动力,勤练习,多看书,这也算是给自己立个目标吧,一个礼拜至少得有3次以上学习记录。期待能在这里遇到更多志同道合的朋友,一起加油!!!...

2020-05-09 09:59:31 89

空空如也

空空如也

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

TA关注的人

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