- 博客(59)
- 收藏
- 关注
原创 【C++】IO流
C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。scanf(): 从标准输入设备(键 盘)读取数据,并将值存放在变量中。printf(): 将指定的文字/字符串输出到标准输出设备(屏幕)。注意宽度输出和精度输出控制。C语言借助了相应的缓冲区来进行输入与输出。
2023-08-17 20:51:48
343
1
原创 【C++】面试题
多态的底层是通过一个虚函数指针实现的,虚函数指针指向一块虚函数表,虚函数表当中存储的各个函数的地址,虚函数表是一个指针数组,虚函数表中存储的是函数指针,当一个表达式满足多态的时候,它确定类型的时候就不是在编译阶段,而是在运行阶段来判断是什么类型,然后根据不同的对象来调用虚函数表。封装:封装是一种集中管理的思想,把内部的数据和实现方法组合在一起,并且不对外暴漏内部的数据和实现方法,只对外提供几个接口来完成函数的调用和数据的操作,保证了数据的安全性和一致性。不会修改引用计数,所以能够很好的解决循环引用的问题。
2023-08-14 16:06:44
652
1
原创 为什么需要智能指针?
问:如果p1这里new 抛异常会如何?p1、p2不会开空间,内存没有释放问:如果p2这里new 抛异常会如何?p2不会开空间,内存没有得到释放问:如果div调用这里又会抛异常会如何?答:内存没有被释放。
2023-08-12 19:24:44
515
3
原创 【C++】异常的使用和细节
异常处理(exception handling)是C++的一项语言机制,用于在程序能处理异常事件。异常事件在C++中表示为异常对象(exception object)。异常事件发生时,由操作系统为程序设置当前异常对象,然后执行程序的当前异常处理代码块,在包含了异常出现点的最内层的try块,依次匹配同级的catch语句。如果匹配catch语句成功,则在该catch块内处理异常;然后执行当前try...catch...块之后的代码。如果在当前的try...catch...块没有能匹配该异常对象的catch语句
2023-08-10 22:51:18
228
原创 【C++】bind包装器
调用bind的一般形式:**auto newCallable = bind(callable,arg_list);**其中,newCallable本身是一个可调用对象,arg_list是一个逗号分隔的参数列表,对应给定的 callable的参数。
2023-08-08 12:09:38
209
1
原创 【C++】function包装器
function包装器的使用格式给你一个字符串数组tokens,表示一个根据表示的算术表达式。请你计算该表达式。返回一个表示表达式值的整数。'+''-''*''/'"+""-""*""/"逆波兰表达式是一种后缀表达式,所谓后缀就是指算符写在后面。如果用常规方法会有很多但如果引入function代码就会简单很多了用function去接收一个Lambda表达式。
2023-08-08 11:46:21
1219
原创 【C++】Lambda表达式的使用
闭包是指一个函数对象,它包含了函数定义时的环境信息,包括捕获的外部变量。闭包的存在使得lambda函数可以延长外部变量的生命周期,并且可以在函数调用结束后仍然访问这些变量。闭包是一个函数对象,它可以捕获外部作用域中的变量,并在其生命周期内访问和修改这些变量。比如:[=, &a, &b]:以引用传递的方式捕捉变量a和b,值传递方式捕捉其他所有变量 [&,a, this]:值传递方式捕捉变量a和this,引用方式捕捉其他变量。函数对象可以像普通的函数一样被调用,其执行的代码就是lambda表达式中的代码。
2023-08-07 21:18:20
2455
25
原创 默认移动构造、默认移动赋值自动生成的条件
而在没有自定义移动构造函数/移动赋值函数的情况下,如果该类自定义了拷贝构造函数/赋值运算符或析构函数之一,都只会调用拷贝构造函数/赋值运算符(前提是形参为const T&而不是T&,因为const T&可以兼容右值实参,而T&不能)而不会生成默认移动构造函数。注意即使没有自定义拷贝构造函数/赋值运算符,只自定义了析构函数,也不会生成默认移动构造函数,这是因为自定义析构函数表明该类在析构时可能需要回收内存,如果生成了默认移动构造函数可能会出错(比如同一地址被释放两次的错误)1.没有声明拷贝构造函数。
2023-08-06 00:35:15
1334
原创 【C++】右值引用
C++11对右值进行了严格的区分: C语言中的纯右值,比如:a+b, 100 将亡值。比如:表达式的中间结果、函数按照值的方式进行返回。
2023-08-06 00:23:12
1347
原创 【C++】万能引用、完美转发
虽然写的是&&和右值引用类似,但是它可以接收左值引用和右值引用当传过来的是左值,那么T&&会折叠为T&。这里输出为什么都是左值引用呢?std::move。
2023-08-04 21:38:10
1386
原创 布隆过滤器
由布隆(Burton Howard Bloom)在1970年提出的 一种紧凑型的、比较巧妙的。其实删除要实现的话意义不大,如果实现了删除,布隆过滤器原本的优势就没有了,还不如用哈希表呢。,它是用多个哈希函数,将一个数据映射到位图结构中。为了降低冲突的概率,我们可以把一个值映射到三个位置上去。布隆过滤器就是为了解决位图不能解决的问题。对每一个位置进行一个数量的标记即可。
2023-08-03 21:47:18
1574
2
原创 【面试题】位图
我们可以用每一个二进制位来记录一个数据,一个int本来只能记录一个数据的,现在可以记录64个数字了,大大减少的空间。将两个二进制序列按位与(&)一下,0&1=0,0&0=0,1&1=1,不会对其他位置的数据造成改变。将两个二进制序列按位或(|)一下,0|1=1,0|0=0,不会对其他位置的数据造成改变。这个其实也简单,开两个位图,然后遍历位图是1 1就代表存在交集,反之没有。读入要查询的数,查看相应bit位是否为1,为1表示存在,为0表示不存在。可以看到,把只出现了一次的数字筛选出来了。
2023-08-02 23:39:30
1646
30
原创 哈希表的简单模拟实现
哈希表是一种查找效率及其高的算法,最理想的情况下查询的时间复杂度为O(1)。unordered_map容器通过key访问单个元素要比map快,但它通常在遍历元素子集的范围迭代方面效率较低。
2023-07-27 21:32:25
1694
41
原创 【C++】AVL树的实现及测试
AVL树也叫平衡二叉搜索树,通过旋转解决了搜索二叉树的不确定性,让整颗树趋近于一颗满二叉树。1.左右都是一颗AVL树2.平衡因子的绝对值不会超过1
2023-07-23 19:30:20
2104
35
原创 【C++】仿函数(less)
是一个函数对象(即仿函数)或者函数模板,它不需要具体的变量名来执行比较操作。用于指定类型,好让less的模板参数识别类型。对于以上代码一开始存在一点疑问,,于是我跑去看了一下文档对。,这里是告诉编译器,在。代码,真的是边学边忘。当中没有具体的参数,这个类(容器)当中的。再来看之前模拟实现的。
2023-07-19 20:59:02
2396
28
原创 热门二叉树面试题
和前序、中序遍历一样,先走完左子树,然后判断右子树,假如我只判断右子树是否为空,在走到节点7回到节点2的时候,这时候要去走2->right,很明显,2->right存在,所以4会被加入答案和栈当中,这时候将节点node置为nullptr,就能避开继续走左子树,直接取栈顶的节点4,4没有右子树了,所以节点4又会被加入到栈当中,就会造成死循环。比如下图,前序遍历的第一个节点是3,那么根节点就是3,再去中序遍历找3,以3为界限划分左右子树,9就是左边的,20,15,7算是右边的。
2023-07-18 21:12:50
1583
34
原创 【C++】二叉搜索树KV模型
最典型的一个场景,自动翻译软件,输入中文,输出对应的英文,输入英文,输出对应的中文。类型的就好了,string记录单词,int记录个数。基础结构和普通搜索二叉树保持一致,只是成员多了一个。可以用一颗搜索二叉树来实现这一功能。如果要实现一个统计单词个数的呢?,模板也多了一个参数V。
2023-07-17 18:01:02
270
1
原创 【C++】二叉搜索树
(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的: 若它的左子树不空,则左子树上所有结点的值均小于它的的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为。二叉搜索树作为一种经典的数据结构,它既有链表的快速插入与删除操作的特点,又有数组快速查找的优势;所以应用十分广泛,例如在文件系统和数据库系统一般会采用这种数据结构进行高效率的排序与检索操作。为什么叫做排序树?因为中序遍历的结果就是排序的结果。
2023-07-17 14:36:52
1948
22
原创 C++中菱形继承中继承不明确问题
其他的虚函数仍然是共享的,因为虚继承会使得类B和类C共享同一个类A的实例,包括类A中的其他虚函数。如果类B和类C分别重写类A中的虚函数test(),那么这个函数就不再被共享,而是存在于类B和类C的虚函数表中的各自实现。因为B、C都虚继承于A,主要用于解决数据冗余,但这就会导致在D创建的时候只有一个A的实例,又由于D是多继承,继承了B和C,所以在D当中存在。假如有三个类A B C,B和C虚继承A,如果B和C分别重写A当中的test(),是不是重写之后这个test就不再共享了,其他的还是共享。
2023-07-15 18:04:56
595
5
原创 【C++】多态及原理
在编程语言和类型论中,多态(英语:polymorphism)指为不同数据类型的实体提供统一的接口。多态类型(英语:polymorphic type)可以将自身所支持的操作套用到其它类型的值上。计算机程序运行时,相同的消息可能会送给多个不同的类别之对象,而系统可依据对象所属类别,引发对应类别的方法,而有不同的行为。简单来说,所谓多态意指相同的消息给予不同的对象会引发不同的动作。
2023-07-14 18:33:31
3937
22
原创 C++中的继承/虚继承原理
继承是一种提高代码复用率的重要方式,它允许程序员在保持原有类的特性的基础上去增加其他特性、功能,这样的类叫做派生类,继承是类设计层次的复用。public:protected:string _name = "牡丹";Student s;Teacher t;s.Print();t.Print();return 0;运行结果为:明明Student和Teacher当中都没有Print()
2023-07-09 18:21:18
2776
9
原创 【C++STL】list的反向迭代器
其实在迭代器当中只有一个参数也可以正常推导,但是在list类当中只有一个参数就不行了,因为如果传递过来的是const修饰的类,然后用T&来接收的话会导致权限被缩小了,所以,为了解决这个const的问题,直接显示的定义模板参数。其实这三个参数是被抽象出来的,__list_iterator等价于__list_iterator
2023-07-07 19:55:25
1552
3
原创 闲置iPad Pro打造真正的生产力工具!使用vscode编程写代码
随着平板电脑的普及,大多数人的生活习惯和生活场景都离不开平板电脑的使用,刷剧,看短视频,玩主流游戏等,但是这些只是娱乐性质的场景,那想实现把平板结合到工作或者生产之中场景中呢,如编辑文档,制作工作表格,编写代码?所以在入手ipad后,为了防止“买前生产力,买后爱奇艺”。我们可以在linux上搭建code server,然后用ipad通过浏览器或者或app,来远程访问code server。使用服务器的资源来跑代码,而ipad前端上只需要负责撸代码和运行就可以啦,让ipad完美变身移动开发工具!!
2023-07-06 12:09:14
847
15
原创 一招教你看懂KMP算法next数组
对于aba和abab,在我们已经知道aba已经对称的情况下,我们只需要确定这两个b是否匹配就行了,所以可以利用上一次匹配的信息,a已经匹配了,所以直接找b即可,匹配规则为下图红字部分。下次匹配的时候直接从s[1+1]开始(这里的数组下标从1开始),但AC和AB又不匹配了,ne[1]=0,下次从s[1]开始匹配。对于图中蓝色框框都是已经匹配成功的信息,但红色框框匹配不成功,那么我们可以利用字符串P的匹配码来减少匹配,ne[j]=1;这里最容易想到的就是暴力匹配了,挨个,依次匹配。ababf没有,匹配码是0。
2023-07-05 17:54:17
1404
原创 【C++ STL】vector模拟实现
c先看一下官方文档中对是怎么描述的。这里的allocator什么的表示内存池,能够更快的申请空间,这次的实现就不实现内存池了,直接new。首先要先声明自己的命名空间mudan然后可以看到参数当中有很多都是没有听过的,一般都是typedef的,可以去查一下可以看到iterator其实就是模板T。成员定义好了就该实现构造函数了。
2023-07-03 14:43:07
2611
26
原创 C++模板初阶
public:// 注意:类模板中函数放在类外进行定义时,需要加模板参数列表// 函数实现可以看到,我们在函数名print的后面加上了,这个就是模板参数列表,它告诉编译器这个函数属于MyVector这个类模板,并且其中的类型参数是T。这样做的原因是,类模板中的函数实现通常都要依赖于类模板的类型参数,而这些类型参数在函数定义时需要在模板参数列表中进行指定。
2023-06-29 16:44:11
1450
3
原创 C/C++内存管理
/ 申请单个Test类型的对象delete p1;// 申请10个Test类型的对象运行结果:可以看到,在使用new和delete的时候会自动调用构造函数和析构函数,但如果没有默认的构造函数会发生什么呢?会导致无法new出对象new的原理1.调用函数进行申请空间2.在申请的空间上去执行构造函数,完成对象的构造delete的原理。
2023-06-29 13:55:52
649
21
原创 类与对象(下)
这段代码是存在问题的,const修饰的成员变量是不能在构造函数内初始化的,需要借助初始化列表上述为正确的代码,那么既然初始化列表就可以完成构造函数,那为什么不只使用初始化列表呢?比如以下的动态开辟二维数组的代码就能很好的解释这个问题临时变量具有常性。
2023-06-25 12:15:06
304
原创 常见指令以及权限理解(Linux)
F 在每个文件名后附上一个字符以说明该文件的类型,“*”表示可执行的普通文件;:touch命令参数可更改文档或目录的日期时间,包括存取时间和更改时间,或者新建一个不存在的文件。:对于目录,该命令列出该目录下的所有子目录与文件。(大小排序,如何找到目录下最大的文件)-r 把指定文档或目录的日期时间,统统设成和参考文档或目录的日期时间相同。-k 以 k 字节的形式表示文件的大小。**功能:**改变工作目录,将当前工作目录改变到指定的目录下。这个目录的信息而不是108这个目录下文件的信息可以使用。
2023-05-15 01:04:08
301
9
原创 C++引用(&)笔记
所以这里会生成一个临时变量,然后对临时变量的类型进行提升,提升之后再与。然后再看引用的汇编代码,可以看到和指针是几乎一摸一样的操作,所以从底层来说引用是开了额外了空间的,引用是类似指针的方式实现的。1.寄存器一般只有4/8个字节,所以返回时候的中间变量(下图的临时变量)不一定是储存在寄存器当中。从语法的层面上来说它是没有开空间的,它就是变量的别名,那么从汇编的角度来看呢?进行比较的时候,由于类型不同,需要对类型进行提升,一般是由小变大,比如这里的。这样的代码是无法通过编译的,因为这里涉及到了一个。
2023-05-13 20:09:32
601
5
原创 快速排序、希尔排序、归并排序、堆排序、插入排序、冒泡排序、选择排序(递归、非递归)C语言详解
直接选择排序思考非常好理解,但是效率不是很好。实际中很少使用时间复杂度:O(N^2)空间复杂度:O(1)稳定性:不稳定堆排序使用堆来选数,效率就高了很多。时间复杂度:O(N*logN)空间复杂度:O(1)稳定性:不稳定快速排序整体的综合性能和使用场景都是比较好的,所以才敢叫快速排序时间复杂度:O(N*logN)空间复杂度:O(logN)稳定性:不稳定归并的缺点在于需要O(N)的空间复杂度,归并排序的思考更多的是解决在磁盘中的外排序问题。时间复杂度:O(N*logN)
2023-05-09 23:14:44
13657
43
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人