- 博客(28)
- 收藏
- 关注
转载 C++:为什么纯虚函数不能实例化
虚函数的原理采用 vtable。类中含有纯虚函数时,其vtable 不完全,有个空位。即“纯虚函数在类的vftable表中对应的表项被赋值为0。也就是指向一个不存在的函数。由于编译器绝对不允许有调用一个不存在的函数的可能,所以该类不能生成对象。在它的派生类中,除非重写此函数,否则也不能生成对象。”所以纯虚函数不能实例化。为什么纯虚函数不能实例化...
2021-07-19 21:46:14
1780
原创 计算机网络: 知识回顾与总结以及每日新增知识(7.19)
1、如何从ip地址获取mac地址通过ARP协议可以根据IP地址获取对方的MAC地址。步骤如下:1、主机A首先会去检查ARP缓存表(ARP缓存用来存放IP地址和MAC地址的关联信息)中是否存在主机C的MAC地址。如果没有缓存那么这时主机A会发送ARP广播报文来获取主机C的MAC地址。2、主机B收到主机A发送的ARP广播请求报文,查看目的IP不是自己会丢弃,但是会在自己的ARP缓存表中记录主机A的IP和MAC的映射关系主机C发现目的IP是自己,会在自己的ARP缓存表中记录主机A的IP和MAC的映射关系
2021-07-19 21:27:42
245
1
原创 计算机网络: 你知道c10k问题吗?
你知道c10k问题吗?c10k问题指的是服务器如何支持10k并发连接c10k在过去的意义重大,早期的互联网面对互联网爆发的增长,同一时间很难做到大量用户同时在线,在最初的服务器都是基于线程/进程进行连接的,而进程又是操作系统最昂贵的系统资源,面对如此多连接,对于单机而言,操作系统是无法承受的,因此,c10k的问题本质上是操作系统的问题,创建的进程,线程多了,频繁的数据拷贝容易导致操作系统崩溃,解决的关键就是尽可能减少cpu等核心资源消耗,可供的选择主要为1、分配进程、线程2、io多路复用,而相比之下
2021-07-15 23:20:02
519
1
原创 计算机网络: 知识回顾与总结以及每日新增知识(7.14)
1、什么是协程我们都知道系统资源分配的最小单位是进程,而资源调度的最小单位是线程,而在c++20引入的新特性是可将线程继续下分,也就是协程,协程又叫微线程,既然是微线程,那自然是和线程有异曲同工之处,比如协程可以处理高并发,相比其线程更加灵活,最大的优势就是极高的执行效率,因为不同于线程需要用户态和内核态的转变,协程由自身控制,没有了线程切换的开销,在越多并发的情况下优势越明显其次协程不需要锁的机制,因为只有一个线程,故不存在线程安全冲突问题,在协程中不需要加锁只要判断状态就好,随时可以进行程序的切换,
2021-07-14 23:56:10
152
2
原创 网络编程:谈到select、poll、epoll该如何说
IO多路复用在面试中是常考的题,一直只知道其概念不知如何去表达selectio多路复用主要是为了解决对服务需要多开进程或者线程,从而造成资源浪费的问题,通过多路复用就很好解决了一个进程可以同时对多个客户请求进行服务,那么其中select作为三个之中跨平台性能最好的复用io,连接的数量却有上限,其中32位机中,最高连接数只能达到1024连接,在64位机中可达到2048连接,连接数不高却很有效,而且其内部底层结构是通过位图实现的,每一个位代表一个连接,对待这么多的连接采用的是线性扫描,通过轮询机制对每一个
2021-07-13 01:53:42
98
原创 计算机网络/数据库: 知识回顾与总结以及每日新增知识(7.11)
1、数据库事务实现原理分为原子性、隔离性、一致性、持久性其中原子性表示了该事务成功与失败的两种情况,成功时所有的提交都要成功,不存在一部分成功的说法,失败则全部失败,不存在只失败一部分的说法隔离性表示两个不同的事务互相独立,不互相影响,例如AB两个事务,A就是A,B就是B一致性表示两个事务之间出现关联时,前后保持一致,比如A+B=100,当A给B转账50之后A加B依旧是100持久性表示当数据完成后,存储在数据库中的数据会一直持续存在,不会说半路消失2、事务的锁有哪些?1)共享锁,即读加锁
2021-07-11 18:02:52
129
2
转载 C++: 内联函数不会重复定义问题
传送门1 问题背景关键字inline用于建议编译器在调用处展开被修饰的函数,但最终是否展开取决于编译器的行为gcc配置参数-O0时不会进行编译优化,inline关键字不生效gcc配置参数-O2时会进行编译优化,inline关键字生效C/C++语法中,如果变量、函数在同一个工程中被多次定义,链接期间会报类似“对 xxx 多重定义”的错误;inline函数如果会在多处被调用,则需要将函数的定义写在头文件中注:当inline函数的声明和定义分别在头文件和源文件中,并且在其他文件中被调用时,链接期间编
2021-07-07 11:54:01
1528
转载 计算机网络:ip地址和mac地址有什么区别
mac地址和ip地址的不同有如下几个方面:1、名称上的区别IP地址是指互联网协议地址(英语:Internet Protocol Address,又译为网际协议地址),是IP Address的缩写。MAC地址(英语:Media Access Control Address),直译为媒体访问控制地址,也称为局域网地址(LAN Address),以太网地址(Ethernet Address)或物理地址(Physical Address),它是一个用来确认网上设备位置的地址。2、分配地址不同MAC地址用于
2021-06-27 19:03:32
16936
原创 C++:static的用法与作用
1、隐藏同时编译多个文件,所有未加static的全局变量和函数具有全局可见性2、初始化一次只能初始化,但是可以有多次赋值,且默认初始化为0,在mian函数之前预编译阶段分配好了内存,只能在类外初始化3、存在时间长存储在静态数据区,作用时间为程序时间4、访问机制(1)作用范围内的static成员变量可以被作用范围内所有函数访问,不能被作用范围外其他函数访问(2)类中static的成员变量属于整个类,每个对象共享该static(3)static成员函数没有this指针,只能访问类内的s
2021-05-29 16:39:11
221
1
转载 C++:当对象只能在堆上创建,当对象只能实例化一个
转自https://blog.csdn.net/caojunhao123/article/details/12314991很多情况下要求当前的程序中只有一个object。例如一个程序只有一个和数据库的连接,只有一个鼠标的object。通常我们都将构造函数的声明置于public区段,假如我们将其放入private区段中会发生什么样的后果?这意味着什么?当我们在程序中声明一个对象时,编译器为调用构造函数(如果有的话),而这个调用将通常是外部的,也就是说它不属于class对象本身的调用,假如构造函数是私有
2021-05-18 10:38:49
294
原创 C++:关于你想知道的继承,都在这里
今日刷题,无意中发现自己对继承这方面的知识还是很迷茫,弄懂了之后回过头再看依旧容易迷糊,俗话说好记性不如烂笔头,写下来就很nice主要是子类调用父类的问题,继承的问题,本文将通过代码的方式讲述继承间调用关系第一部分以下代码摘自https://blog.csdn.net/qq_36528804/article/details/87873174?utm_source=app&app_version=4.7.0#include <iostream>using na.
2021-05-11 23:45:49
94
原创 C++:algorithm常用算法函数
在头文件#include 库函数下的sort()基于快速排序实现的,是不稳定的函数只对vector、deque、list这三个容器提供支持stable_sort()基于归并排序实现的,是稳定的函数binary_search()二分查找法,在有序序列中查找,找到返回true在无序中不可使用count()把标志范围内的元素与输入值进行比较,返回相等的个数find()用于在指定范围内查找和目标元素相等的第一个元素max()求两个数最大值min()求两个数最小值abs
2021-05-10 16:34:36
202
原创 C++:Map和multimap容器
map和multimap的简介map是标准关联式容器,一个map是一个键值对序列,即(key, value)对。提供基于key的快速检索能力map中的key是唯一的,而multimap中的key不是唯一的集合中的元素按一定顺序排列(基于红黑树,是平衡二叉树,在插入和删除操作上比vector快)元素插入过程是按排序规则插入,不能指定插入位置map可以直接存取key对应的value,支持[ ]操作符,如map[key] = value(将key键对应的值修改为value)multimap与map区别
2021-05-10 12:32:25
241
原创 C++:reverse函数
今天做笔试题,用到库函数,发现一直不太会用,而且使用频率挺高的 写下这些记录一下reverse是C++下的库函数,可用于翻转字符串,翻转链表等使用需要添加头文件#include <algorithm>reverse()会将区间[beg,end)内的元素全部逆序;其中区间翻转1.reverse(str.begin(),str.end()) 反转字符串 2.reverse(vector.begin(),vector.end()) 反转向量 3.reverse(a,a+s
2021-04-24 16:17:31
21030
1
原创 C++:关于你想知道的多态,看这一篇就够了
本章用浅显的知识梳理一遍我对多态的理解从头读到尾,心中形成多态知识体系树1、多态分为静态多态和动态多态(通常我们所说的多态为动态多态,其实静态多态不太算多态)2、首先来谈谈静态多态(编译时多态,在编译期间确定的)静态多态可分为函数重载,运算符重载,类模板,泛型编程等等其中函数重载为C语言和C++的区别(C语言是没有函数重载的,同时C++11特性也引入nullptr也是因为函数重载的原因)(1)那么什么是函数重载?函数重载是C++允许在同一作用域中声明几个类似的同名函数,这些同名函数的形参列表(
2021-04-19 01:26:42
190
原创 C++:pair
关于pair的使用,认为是有两个不同的容器合集,或者说将两个容器视为一个单元可以通过pair<T1,T2> pair1; pair.first 为T1,pair.second为T2两个值的类型可以不一样,比如T1为int ,T2为float一段小程序set<int> se;pair<set<int>::iterator, set<int>::iterator> pair1 = se.equal_range(5);set<
2021-04-19 00:40:30
80
原创 C++:容器Set/multiset/unordered_set
set(红黑树)(自动排序)头文件:#include <set>是一个集合容器,其中包含的元素是唯一的,通过红黑树的数据结构实现集合中的元素按照一定的顺序排列,且不能指定插入位置在插入和删除操作上比较快速不可以直接存取元素,不可以使用类似at.(pos)与[]操作符不可直接修改容器中的元素值,如果要修改需要删除原有元素而后再插入新的元素采用类模板实现,其默认构造函数: set<T> s;可进行元素排列: set<int , less<int&g
2021-04-19 00:33:57
355
原创 C++:容器list
list(双向链表)头文件:#include <list>双向链表容器,对于添加删除操作特别高效,对于查找操作为**O(n)**的时间复杂度不可随机存储元素,不可使用[]和at()采用模板类实现,其默认构造形式:list<T> lis;函数部分:lis.push_back(num);//往容器尾部加入一个元素lis.pop_back();//删除容器尾部最后一个元素lis.push_front(num);//往容器头部加入元素lis.pop_front();//
2021-04-09 11:27:29
74
原创 C++:容器queue
queue(队列)头文件:#include<queue>先进先出的容器采用类模板实现,其默认构造形式:queue<T> que;函数部分:que.push(num);//往队尾添加元素que.pop();//从队头移除第一个元素queue(const queue &que);//拷贝构造函数queue &operator=(const queue &que);//重载等号操作符que.back();//返回最后一个元素que.fro
2021-04-09 10:51:26
48
原创 C++:容器stack
stack(栈)(LIFO)头文件:#include<stack>后进先出的值的排列采用模板类实现,其默认构造形式:stack<T> sta;函数部分sta.push(num);//往栈顶添加元素sta.pop;//移除栈顶元素stack(const stack &stk);//拷贝构造函数stack &operator=(const stack &sta);//重载等号操作符sta.top;//返回栈顶元素sta.empty();
2021-04-09 10:41:46
48
原创 C++:容器deque
deque(双端数组)(可用[]访问)头文件#include<deque>连续存储的元素**(迭代器返回注意失效问题)**,尾部头部添加或者移除都非常快速,在中部加入删除比较费时间采用模板类实现,其默认构造形式:deque<T> deq;函数部分相比与vector多了两个函数而已,详情参考vector篇deq.push_front(num);//在容器头部插入 一个元素deq.pop_front();//在容器头部删除第一个元素deq.front();//返回数组
2021-04-09 10:28:19
56
原创 C++:容器vector
写个容器总结,也给自己回顾的时间vector,打算写完几个容器容器分类:顺序性容器:vector、deque、list、stack、queue关联式容器:set、multiset、map、multimapvector(数组)(可用[]访问)头文件:#include<vector>连续存储的元素(迭代器返回注意失效问题),尾部添加或者移除非常快速,中部或者头部插入元素或者移除元素比较费时间采用模板类实现,其默认构造形式:vector<T> vec;函数部分:v
2021-04-09 00:18:20
142
转载 算法:B树、B+树、B-树、B*树总结
1、平衡二叉树- 概念平衡二叉树是基于二分法的策略提高数据的查找速度的二叉树的数据结构;- 特点平衡二叉树是采用二分法思维把数据按规则组装成一个树形结构的数据,用这个树形结构的数据减少无关数据的检索,大大的提升了数据检索的速度;平衡二叉树的数据结构组装过程有以下规则:(1)非叶子节点只能允许最多两个子节点存在。(2)每一个非叶子节点数据分布规则为左边的子节点小当前节点的值,右边的子节点大于当前节点的值(这里值是基于自己的算法规则而定的,比如hash值);平衡树的层级结构:因为平衡二叉
2021-04-02 17:15:48
203
原创 C++:cin和scanf 以及通过std::ios::sync_with_stdio(false)提升
最近在做算法题,对时间和空间有一定要求,往往需要更加快速的读取方式初学C++大多接触的是cin输入以及cout输出,在学C的时候大多接触的是scanf以及printf输出然而经过测试发现,cin输入实惨在相同的代码下,cin的输入和scanf的相差可以达到几秒的差距,如果是写较大工程,差别想必更大,难道C++选手只能干着急?首先我们先明白原理,cin 、cout之所以效率低,是因为先把输出的东西存入缓存区,再输出,而导致效率低下那么我们只要关闭了缓存,那么读写速度将大大提升,便有如下代码std:
2021-03-30 11:22:39
176
转载 算法:动态规划
今天刚好学习了下算法内容,发现很多公司都有类似动态规划的题目,思来想去看到一篇文章,有助于理解什么为动态规划分享如下动态规划漫画解释
2021-03-27 15:47:46
64
原创 C++:内联函数
一、什么是内联函数内联函数是一种计算机科学中的编程语言结构,指那些定义在类体内的成员函数,即该函数的函数体放在类体内。内联函数从源代码层看,有函数的结构,而在编译后,却不具备函数的性质。内联扩展是用来消除函数调用时的时间开销,通常用于频繁执行的函数。—来自百度二、内联函数有什么用呢?通过替代函数调用的语句,可以达到降低程序运行时间的效果,通常适用于较小的代码程序段,倘若代码过大,编译器将忽略内联的声明而看做是普通函数因为内联函数是发生在编译阶段而非程序运行阶段,即在编译时将消耗内存在内联的地
2021-03-25 21:55:36
94
原创 C++:const详解
const在英语中有常数的意思,应用在多个地方作用无外乎表达不可修改的大意从以下几个方面来谈谈个人见解,以及学习中理解的内容,如有不对之处,还望各位多多指正。1.const修饰变量1.1、const int a;当const修饰变量a时,将a的值由变量该为了常量,其中a的值是只读的不可修改 1.2、const int *p;该语句表示指向的整形常量的指针,它指向的值是无法更改的1.3、int const *p;和const int *p所表达类似,表示指向整形常量的指针,指向的值同样是无法修改
2021-03-25 21:23:08
1313
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人