![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 55
空、白、
NO GAME NO LIFE
展开
-
【C++】关于子类之间使用static_cast进行强制转换的问题
今天研究BVH的构造过程的时候遇到了这样的一行代码:这里的hittable_list和bvh_node的继承自同一个基类hittable,然后他们有共同的虚函数hit。说实话这一行代码给我看的有点懵,不知道怎么完成的转换,于是自己实验了一下:我用三个类模拟了一下上述语句的大致做法,结果发现需要一个从hittable到Bhitable的构造函数于是:扫盲了。如果两个子类之间做转换,转换的步骤应该是:子类A->父类->子类B,是一个三角的上下行转换关系。但是在这样转换的时候却必须要原创 2021-08-18 15:43:29 · 420 阅读 · 0 评论 -
【学习总结】C++八股文(应该会持续更新,嗯 )
跑路吧,做游戏没有前途的,hhhhC++八股文C++基础面向对象编程部分类部分内存管理相关关键字相关STL与泛型编程部分容器(Containers)迭代器(iterator)算法(algorithm)仿函数(Functor)适配器(adpater)分配器(allocator)C++基础面向对象编程部分类部分面向对象的三大特性:封装、继承、多态封装:即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别继承:子类继承父类的特征和行为,使得子类对象(实例)具有父类的属性和原创 2021-08-05 20:12:17 · 2258 阅读 · 3 评论 -
【LeetCode刷题笔记-977.有序数组的平方】
今天这题有点意思,所以记录一下暴力的想法自然是先遍历一遍数组然后再排序,但是这样会超时,因为时间复杂度还是比较高。因此需要别的方案。由于要按照非递减排序,我们很自然就能想到,平方最大值产生的位置是数组的末尾或者是队首。因此,使用双指针移动遍历数组,每次都进行平方判断,将较大的那个数加入新数组的末尾。最后返回即可。代码:(C++附带测试)#include<iostream>#include<vector>#include<algorithm>#include.原创 2021-07-14 09:29:47 · 88 阅读 · 0 评论 -
【LeetCode刷题笔记645:错误的集合】
题目:今天这题思路上来就有了,要么排序逐一比对,要么哈希表记录,两种都可以。另外,今天虽然是排序1~n的整数,但是不能使用直接挪动到相应位置上的办法,因为那样虽然可以找出重复的数字,但是无法找出缺少的数字。排序:class Solution {public: vector<int> findErrorNums(vector<int>& nums) { vector<int> errorNums(2); int n原创 2021-07-04 10:48:16 · 99 阅读 · 0 评论 -
【LeetCode刷题笔记:451.根据字符出现频率排序】
题目:今天这题的思路算是比较简单的,遍历一遍得到每个字符出现的数量,然后根据数量大小排序直接替换string字符即可。但是,写这题的时候没注意看下面的测试用例还有大写字母,所以一开始就按照全小写字母的方式去建立了一个26X2的二维数组,用于统计数量导致出错。优化方法也很简单,既然多了大写字母,那么为了避免额外的一些开销,我们这里还是使用哈希表比较好。因此,思路就变为:我们使用哈希表去存储每一个字符出现的数量。然后将数量和对应字符使用一个Pair暂存到一起,让其可以插入Vector中使用Sort(原创 2021-07-03 11:38:57 · 121 阅读 · 0 评论 -
【LeetCode刷题笔记:1833.雪糕的最大数量】
考完了,也找到了实习。准备去上海巨人网络了~然后就是紧张的实习生活以及准备秋招。所以开始回到LeetCode当常驻选手了。题目:今天这题如果不使用计数排序法的话,其实就是简单题。只需要简单排序一下数组,然后采用贪心的思路来计算得到最终的结果。(为了复习一下算法,排序并未使用sort,自己重写了一次快排,但是会有一个非常极端的测试用例会超时,所以提交的时候还是用的Sort)代码(C++版本)#include<iostream>#include<vector>#incl原创 2021-07-02 21:16:53 · 83 阅读 · 0 评论 -
【LeetCode刷题笔记(不计数了)-363.矩形区域不超过K的最大数值和】
题目:这题的测试数据很弱,暴力搜索也是可以偶尔通过的。但是这里追求一个更快的优化办法。(虽然本质上我个人觉得就是暴力的优化方法)首先,由于这个矩形的四个顶点都是不固定的,而且如果采用类似DFS这样的算法,会有一个舍弃和矩形形状的问题,想想就十分复杂。所以我们必须放弃这种搜索方式。其次,对于矩阵区域的做法,我们常常可以见到将行或者列进行固定,然后动态搜索一边的做法。这里的优化方式采用的是累计列和,然后搜索行的方式。这里引用一下评论区大佬的图片:累计列的和然后搜索行这种累计方法最巧妙的地方在于原创 2021-04-22 11:21:35 · 85 阅读 · 0 评论 -
【C++】关于字符串实际大小和转义字符等问题
今天遇到了strlen()和sizeof()去计算字符串大小的问题。我理了一下,用一个程序表达一下自己的理解。首先,我们要明白字符串里面\0后面如果跟的是数字,则有可能被翻译成八进制转义字符。比如下面这一段:我新建一个字符串为"1234\0147",那么统计的时候,\0不会被翻译为字符串的终止位置,而是被翻译成了八进制转义字符的\014,也就是上面这个东西。因此,计算内存空间的时候,实际占空间为 1 2 3 4 \014 7 \0,七个字符。而计算长度的时候,会舍弃\0,显示为6个字符。那么原创 2021-03-25 17:15:10 · 714 阅读 · 0 评论 -
【C++】自定义MyString类
这次主要是实践一下内存的管理和类的一些写法。当然了,还包括<<运算符的重载。一些需要注意的点:1.内存空间的管理一定要处理好,new[]一定要搭配delete[]使用2.拷贝赋值函数要检测是否是自我赋值,不然内存空间会直接销毁3.为了可以连续使用=和<<,返回值务必使用引用4.其它的就是一些编码小细节了,代码里面大部分都有注释PS:今天才发现字符数组居然是可以直接输出的。我之前都是一个个遍历的,人晕了#include<iostream>#include&l原创 2021-03-19 20:01:25 · 1168 阅读 · 0 评论 -
【剑指offer10】斐波那契数列
题目:关键点:1.记得取模2.返回值返回f13.尽量使用循环避免递归栈溢出C++代码(附带测试)#include<iostream>using namespace std;class Solution {public: int fib(int n) { int f1 = 0; int f2 = 1; int temp = 0; for(int i=0;i<n;i++){ temp = (f1 + f2)% 1000000007;原创 2021-03-19 10:38:42 · 48 阅读 · 0 评论 -
【剑指offer09】双栈实现队列
题目:关键点:1.维持两个栈,一个作为输入栈,一个作为输出栈2.只有当输出栈为空的时候,才将输入栈中的元素导入输出栈,因为要满足队列的性质要求C++代码(附带测试):#include<iostream>#include<stack>using namespace std;//一个栈作为输入栈,一个栈作为输出栈//只有当输出栈为空时,才导入输入栈的值,因为要满足队列的特殊要求 class CQueue {public: CQueue() {原创 2021-03-19 10:36:58 · 75 阅读 · 0 评论 -
【C++】快排,归并,堆排序
今天复习了一下三大排序的写法,具体的原理我就不细讲了,代码需要注意的地方我都打上了注释,并且附带了测试。欢迎大家指点一二。C++代码:#include<iostream>using namespace std;class Solution{ public: void MergeSort(int arr[],int low,int high){ if(low>=high){//说明分割递归到了顶点 return; } int mid =原创 2021-03-16 19:33:51 · 92 阅读 · 0 评论 -
【LeetCode刷题笔记-76 706:设计哈希映射】
题目:如果做过昨天的题目的话,今天这题就很简单。我们知道哈希Map是一个key对应一个value,那么在昨天的基础上使用pair模板去插入这个值就好了。访问的时候用迭代器的first和second访问C++代码:(测试从昨天那里扒)class MyHashMap {public: vector<list<pair<int, int>>> hashmap; static const int base = 769; static int has原创 2021-03-14 11:04:20 · 111 阅读 · 0 评论 -
【C++】快速排序
快速排序是排序算法中相当重要的排序了。这两天复习了一下,并且尝试着写了一个相对精炼的版本。首先,如果没有明白快速排序算法的原理的话,建议直接看这个视频。比文字表达会强上很多。快速排序原理讲解那么我们来实现一下快速排序:有一些细节是我觉得比较重要的1.快速排序算法传参数最好是用引用或者指针来做,不要设定返回值。因为这是一个递归的算法,设定返回值很容易出错。而且我至今没思考出来设定返回值的版本怎么写。2.关于i和j的判定,由于i= =j的时候是非常多地方的停止条件。所以,与其用i= =j一个一个判原创 2021-03-13 13:02:45 · 87 阅读 · 0 评论 -
【C++】面向对象高级编程(完结):一些补充要点
–本文章来自侯捷老师的课程和自己的理解形成的笔记若有错误,欢迎指出1.转换函数转换函数,顾名思义就是可自定的类型转换。第一种是自己的类转换成别的类型。如下图,就支持将这个分数类转换成double类型,因此程序运行的过程中,double d = 4+f这样的语句是可以运行的。第二种是别的类型转换成自己...原创 2021-03-12 16:09:59 · 62 阅读 · 0 评论 -
【C++】面向对象高级编程(3):类与类之间的关系
–本文来自侯捷老师的课程和自己的理解形成的笔记若有错误,欢迎指出C++类和类之间,在侯捷老师的课程中,一般被分为三种关系复合关系、委托关系和继承关系复合关系:指类中包含另一些类比如STL里面我们说过,queue类里面包含一个底层容器类deque,用图的表现形式可以如下:符合关系下的内存,需要将其含有的类也拆开去计算。复合关系下的构造与析构:这三种类型都只用记住一句话:构造由内向外,析构由外向内。委托关系:类A中有类B的指针,可以随时调用B。既然使用了指针,代表A和B的生命周期是不同原创 2021-03-12 15:36:30 · 335 阅读 · 0 评论 -
【C++】面向对象高级编程(2):关于含指针的类的注意事项
–本文章来自侯捷老师的课程和自己的理解形成的笔记若有错误,欢迎指正接下来介绍带指针的类:带指针的类之所以需要单独注意,是因为这些类一般都会要自己重新写拷贝构造,拷贝赋值,以及析构函数。因为编辑器默认的函数只会拷贝指针。首先,构造函数和析构函数需要使用new和delete对空间进行操作:需要注意的是,new【】需要搭配delete【】。因为这样编译器才会知道要多次调用析构函数来归还空间。所以一定要加【】。之所以需要自己的拷贝函数,是因为编译器在拷贝的时候,使用默认的拷贝函数,只会拷贝指针,而没原创 2021-03-12 14:59:13 · 242 阅读 · 0 评论 -
【C++】:面向对象高级编程(1):类的一些通用法则
–本文来自侯捷老师的C++面向对象高级编程和自己的理解形成的笔记若有错误,欢迎指正头文件引入时,调用系统的用 <>,使用自己的用 " "C++的类一般分为两种,一种是带指针的,一种是不带指针的。自定义类较为正规的写法如下:此种做法的意义在于防止被反复调用以及先后调用时出错。只有当该类未被定义的时候,才会调用此文件去定义这个类。我们需要尽量将成员函数声明为内联(inline)函数,尽管编译器对某些函数的处理不会按照内联函数来,但还是能提前处理一个就提前处理一个。此外,在构造函数赋值原创 2021-03-12 14:40:03 · 73 阅读 · 0 评论 -
【C++】STL系列(10,完结篇):适配器
–本文章来自于侯捷老师的STL课程和自己的理解若有错误,欢迎指正适配器是STL体系结构里面也是相当重要的一部分。容器,迭代器和仿函数都有他们自己的适配器:说到底适配器到底是一个什么东西,发挥什么作用这是需要先弄清楚的问题。我个人觉得适配器这个概念应该还是起源于适配器的设计模式。就是让原本的接口经过改造形成新的,适应新环境的接口。比如容器适配器,stack和queue。我们之前说过这两个容器的底层是由deque支撑的。但是从另一个角度来说,这两个容器也就是对deque进行改造而实现的。这是容器原创 2021-03-08 17:34:17 · 114 阅读 · 0 评论 -
【C++】STL系列(9):算法与仿函数
–本文章来自侯捷老师的STL课程和自己的理解若有错误,欢迎指正现在要说到STL里面另一大重要部件了,算法。其实在我个人的理解里面,整个STL都是为了能让元素,对象更好的使用算法而建立的。我觉得如果把握住了为算法服务的这个思想,很多东西其实就都能理解了。还记得迭代器的五种种类吗?因为算法对容器内部的元素一无所知,所以所有的信息都需要由迭代器来提供。那么为什么要设计这么多的迭代器种类呢?我们打开部分算法的源码可以发现,原来迭代器种类的不同也会影响算法效率:上方的算法是distance(),用于原创 2021-03-08 16:58:57 · 189 阅读 · 0 评论 -
【C++】STL系列(8):底层容器hash_table(哈希表)和其支撑的unordered_set与unordered_map
–本文章来自侯捷老师的STL课程和自己的理解若有错误,欢迎指正除了红黑树可以作为set与map的底层结构之外,还有一种结构叫做哈希表也可以。哈希表可以说是十分熟悉的一个结构了,很多地方都有使用到这个结构。操作系统(内存分配那一块),算法与数据结构,基本都有提及。哈希表是怎么一回事呢?首先我们需要知道什么是哈希函数。所谓哈希函数,就是你不论扔多少长度的东西进去,总能完成一个编码过程。这个编码过程会根据你输入的东西来得到一个值,我们一般叫做哈希值。这个值有什么作用呢?举个很简单的例子。比如我原创 2021-03-08 16:03:53 · 1315 阅读 · 0 评论 -
【C++】STL系列(7):底层容器rb_tree(红黑树)和其支撑的set与map
–本文章来自于侯捷老师的STL课程和自己的理解若有错误,欢迎指正首先,红黑树是一种高度平衡的二分查找树,排列规则有利于search和insert并保持平衡。(红黑树之后会单独开专栏说)红黑树提供“遍历”操作及iterator,排序状态是从左子树->右子树我们不应该使用rb_tree的iterator去改变元素值,因为会破坏结构,但是变成层面没有禁止这件事情。因为map容器允许data被改变,而key才是不能被改变。rb_tree提供两种insertion操作:insert_unique()原创 2021-03-07 22:06:02 · 728 阅读 · 0 评论 -
【C++】STL系列(6):容器deque以及其支撑的stack和queue
–本文章来自侯捷老师的STL课程和自己的理解若有错误,欢迎指正现在我们来介绍以下STL容器中相对复杂一点的容器,deque。deque是一个双端队列,本质上是分段连续,如上图,是使用Vector装入指针,由指针指向缓冲区的方式来串接整个deque的。由于其独特的设计,因此呈现给用户的看起来就像是一个可动态扩展的连续的双端队列。部分源码如上图,可以看见deque内部有两个迭代器,指向整个deque的头和尾种类都是random_access_iterator。一个指向Vector map的指针和一个原创 2021-03-07 21:01:01 · 149 阅读 · 0 评论 -
【C++】STL系列(5):容器vector和array
–本文章来自于侯捷老师的STL课程和自己的理解若有错误,欢迎指正Vector可以说是C++里面最常使用的容器了,比较重要的部分见上图。首先,Vector的操作近似于一个数组,并且可以动态扩展,并且每次扩展申请的内存变为两倍。因此,Vector数组的内存存放方式不可能是原地扩充。如上图所见,Size()返回的是Vector中元素的个数,Capcity()返回的是Vector申请了多少的空间长度。内部有三个指针:(靠这三个指针控制所有操作)start指向Vector的开头finish指向最后一个原创 2021-03-07 19:57:20 · 174 阅读 · 0 评论 -
【C++】STL系列(4):容器list和forwardlist
–本文章来自侯捷老师的STL课程和自己的理解如有错误,欢迎指出首先是list的内部结构:list是一个双向链表,是由class list和_list_node组合实现的。list中只有一个指向list_node的指针,而list_node才是双向链表元素的具体存储位置。list在实现上使用了一个虚节点,这样方便整体操作和实现。此外,list也拥有自己的迭代器,用它来处理相邻链表的跳转,内部重载了大量的操作符,因为要让它能像指针一样使用。迭代器种类属于双向迭代器。list的构造函数:list原创 2021-03-07 16:52:16 · 268 阅读 · 0 评论 -
【C++】STL系列(3):迭代器Iterator
–本文章来自侯捷老师的STL课程和自己的理解如有错误,欢迎指出这里我打算打乱老师的讲课顺序,因为毕竟是总结性质的文章,我觉得先介绍迭代器会比较好。迭代器是链接算法和容l器的桥梁。算法对容器里面的一切都一无所知,他所需要的一切信息都由Iterator提供。迭代器有五种(种类):struct input_iterator_tag{};(只读迭代器)struct output_iterator_tag{};(只写迭代器)struct forward_iterator_tag:public input原创 2021-03-07 16:31:49 · 290 阅读 · 0 评论 -
【C++】STL系列(2):分配器allocator
–本文章来自于侯捷老师的STL课程外加自己的理解若有错误,欢迎指正首先,分配器的作用就是为容器分配所需要的内存。非常关键的一个点是, C++底层调用内存分配的函数::operator new()和::operator delete()最终都是调用C中的malloc(),内存分配函数,和free()内存释放函数。而malloc()函数所分配的空间会大于实际用户所申请的空间:下图Size部分才是实际申请的部分,而其余的部分都是额外附加的cookie注:在VC6中,所有的容器默认都是使用alloca原创 2021-03-07 16:01:46 · 253 阅读 · 0 评论 -
【C++】STL系列(1):STL六大部件和容器概括
–本文章来自于侯捷老师STL相关课程和自身理解整合做出的个人笔记若有错误,欢迎指正STL的意思是C++标准模板库(Standard Template Library)它其中由六大部件和一些边角构成:1.容器(Contaniers):存放需要操作的元素数据2.分配器(Allocators):为容器提供内存空间3.算法(Algorithms):通过迭代器操作容器内部存放的元素数据4.迭代器(Iterators):连接算法和容器的桥梁,作用类似于指针,甚至可以直接当作指针处理。5.适配器(Adap原创 2021-03-07 15:41:35 · 495 阅读 · 0 评论