- 博客(22)
- 收藏
- 关注
原创 C++ 常见问题集合大汇总
1.什么是多态,C++的多态如何实现多态就是同一函数名的不同形态,提供具有不同行为的接口, C++的多态又分为静态多态和动态多态。 静态多态(编译时多态)通过重载和模板实现, 动态(运行时)多态通过虚函数和继承实现。2.虚函数的实现机制是什么 虚函数是通过虚函数表来实现的,虚函数表中存放着一个类中所有的虚函数地址。在类对象中的内存空间头部存放着一个虚函数指针 这个指针指向虚函数表,当子类对象对父类的虚函数进行重写时,虚函数表中的此函数的地址就会改变,在运行时指明实际调用的函数。...
2021-11-21 12:47:24
1849
原创 List底层剖析
List容器:链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链 表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点 可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是 存储下一个结点地址的指针域。相较于 vector 的连续线性空间,list 就显得负责许多,它的好处是每次插入或者删除 一个元素,就是配置或者释放一个元素的空间。因此,list 对于空间的运用有绝对的精准, 一点也不浪费。而且,对于任何位置的元素插
2021-11-21 12:46:44
1719
原创 Deque
Deque容器 底层实现:deque,双向队列,由分段连续空间构成,每段连续空间是一个缓冲区,由一个中控器来控制。它必须维护一个map指针(中控器指针),还要维护start和finish两个迭代器,指向第一个缓冲区,和最后一个缓冲区。deque可以在前端或后端进行扩容,这些指针和迭代器用来控制分段缓冲区之间的跳转。Deque 查找删除 插入 时间复杂度:deque支持随机访问,但性能比vector要低;支持双端扩容,因此在头部和尾部插入和删除元素很快,为O(1),但是在中间插入和删除元素
2021-11-21 12:46:06
1464
原创 Vector
Vector容器:Vector相比于 array 空间的运用更灵活, array是静态空间,一旦配置了就不能再改变。 而vector 是动态空间会随着数据量的增加自动扩容(扩容机制 (重新开辟内存, 复制, 为什么二倍扩容))首先 自动扩容为什么是成倍的 而不是一次性增加多少数值这样子。(原因:因为成倍扩容它的复杂度平均下来是 常数级, 而一次性增加多少数值是O(n))为什么是2倍原因: (首先不一定是2倍 也有可能是1.5倍)考虑可能产生的堆空间浪费,成倍增长倍数不能太大,使用较为
2021-11-21 12:45:25
4978
原创 Games101 计算机图形学入门 作业3 以及可能遇见的问题
今天做了一下午的作业3,踩过的坑真的太多了!!!下面做个汇总 大家以后也少走些弯路。1.框架中有错误找不到成员。 这个是C++语言版本的问题,需要更改成C++17点击扩展设置在这里更改成C++17对于作业3中的第一步光栅化。和作业2差不多,在这一起梳理一下。光栅化1.转换得到三角形的坐标并且构建包围盒auto v = t.toVector4(); float min_x = std::min(t.v[0].x(), std::min...
2021-11-07 20:50:36
2038
3
原创 动态规划求组合,排列
首先组合则是不讲究顺序 {2.2.3}和 {2.3.2}是同一个组合。而排列是讲究顺序的 {2.2.3}和{2.3.2}是俩个不同得排列。在动态规划中我们求组合或者排列dp[j] 表示:填满j(包括j)这么大容积的包,有dp[i]种方法有哪些来源可以推出dp[j]呢?不考虑nums[i]的情况下,填满容量为j - nums[i]的背包,有dp[j - nums[i]]种方法。那么只要搞到nums[i]的话,凑成dp[j]就有dp[j - nums[i]] 种方法。举一个例子,n.
2021-10-20 15:53:36
791
原创 动态规划
在此之前一直对动态规划原理不太清楚,很多时候都是稀里糊涂的就过了。所以决定捋一遍更好的去理解。第四部就是遍历顺序,其实二者都可以,对于先遍历背包还是先遍历物品都行for(int i = 1; i < weight.size(); i++) { for(int j = 0; j <= bagweight; j++) { if(j < weight[i]) dp[i][j] = dp[i - 1][j]; else d...
2021-10-20 13:16:32
60
原创 回溯回溯回溯
今天做了回溯问题中的排列,和组合。在不同问题中我们for循环的启始位置是应该不一样的,在最初我是采用的是for(int elem: { })这种形式,所以在每次递归的时候都会从开始来选择元素。在组合问题中,不同的组合不能出现完全相同的元素,而我每次都将之前选取的元素使用了。所以组合问题在一个集合中取组合的情况下,我们需要采用 startIndex来记录我们的下一次选择元素的范围,而在几个集合中取组合则不需要考虑这种情况,我们每次都可以从第0个开始选择。而在全排列的问题中我们每次都需要从...
2021-10-10 12:22:32
76
原创 LeetCode刷题日记之回溯(组合)
今天解决了回溯的39. 组合总和40. 组合总和 II这两道题,首先这两道题的区别一个是本元素可选另外一个就是去重了。去重这点在之前电话号码的时候是不存在的关键在于去重,在39题只能存在唯一组合下面贴上代码和每句的注释。class Solution {public: void backTrcak(vector<int>& candidates, int target, vector<vector<int>>& resu...
2021-10-09 17:51:50
66
原创 回溯之电话号码的字母组合(保姆级代码)
今天做到电话号码的字母组合这道题,这种其实就是穷举的暴力解法。将所有的组合,排列都列举出来,第一次想的方法就是用for循环,但是是数字不定的举例,所有得用回溯和递归来解决。关于回溯与递归,这篇文章写得特别清楚代码随想录,在这再说一次大佬真的特别牛!如果文字还不够清楚,可以看看大佬出的视频这里就不在赘述了。以下附上自己的解题心得与思路。class Solution {public: void backTrack(int index,const string& digits,v...
2021-10-08 23:19:13
218
原创 leetcode刷题插曲(盛水最多的容器)
在之前一天晚上我在寝室刷题的时候,室友看见了这道题盛最多水的容器,然后在我给他讲清楚了题目的意思后,开始了窒息的操作!从第一眼就看出来的暴力解法,求每个容器盛的水进行比较 到 经过优化后的最大底慢慢往里面逼近。此时重点来了,寝室莫名其妙就聚集了隔壁寝室的人。每个人都对这道题有不同的解法,在同学A提出解法不对,在向里面逼近时不需要对高比自己矮的计算,而同学B觉得题解就是最优解,无法再被优化,进行了长达2个小时的争辩。哈哈哈 想起来当时也是都钻了牛角尖。在底最大的时候向里面逼近 长肯定会减小,所以得..
2021-10-06 23:02:52
78
原创 关于二分查找
在做二分查找相关的题时,总是会疑惑 何时取left<right 还是小于等于。还有在比较目标元素的时候是否该取<= ,区间的定位还不够一眼看出。在做剑指 Offer 53 - I. 在排序数组中查找数字 I的时候 这道题采用二分来做的时候就可以很好的来理解二分查找了。二分查找其实也可以是二段的,分开来查询, 在我们思考的时候其实也可以查找目标元素的左边界和右边界。具体的解题方法就不再赘述了,解题的大佬肯定比我说的更清楚。我的想法当时就是找到当前数组的左边界,但怎么取找呢在我们..
2021-10-06 22:52:24
101
原创 虚函数与虚函数表
C++虚函数表在我们使用虚函数的时候会多出四个字节大小的指针,这个指针指向的就是虚函数表。虚函数是通过虚函数表来实现的,解决了继承覆盖 保证反应的是真实的函数 虚函数表出现的位置是在最前面 也就是在编译的过程中就创建了而虚函数指针是在实列化对象的时候 对象创建的时候 运行时创建这样来实现函数的多态C++ 多态多态就是一种事物在不同情况下的不同形态静态多态就是在编译期间完成的,编译器会通过合适的函数来调用合适的函数,如果可以就调,不行就报错动态多态 是在程序运行
2021-10-06 22:39:47
134
原创 new和malloc的异同
同: malloc和new都能用来动态的申请内存和释放内存异:Malloc和free是标准库的函数,而new 和delete是操作符申请的位置不同New是从自由储存区上为对象动态的分配内存,而malloc是从堆上动态的为对象分配内存自由存储区是C++基于new操作符的一个抽象概念, 凡是通过new操作符进行内存申请的, 该内存称为自由存储区。 而自由存储区的位置取决于operator new的实现细节。自由存储区不仅可以是堆, 也可以是静态存储区, 取决operator new在哪..
2021-10-06 22:38:19
579
原创 C++内存管理
C/C++内存分配管理首先堆: 一般有程序员手动分配,程序结束后有可能被OS回收 其分配类似于链表 用于程序的动态分配栈:是有编译器自动的回收和处理 我们运行函数存放的局部变量,函数参数,返回数据 返回地址等全局区:存放的是全局变量 静态数据和常量,是在编译初期就已经分配好了的 在整个程序运行阶段都存在 运行结束后由系统释放自由存储区:自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区堆和栈的不同栈上面的数据由系统自.
2021-10-06 22:36:46
69
原创 指针和引用的区别(C++)
指针和引用的区别:引用在创建的时候必须初始化。(指针可以在任何时候被初始化)引用不能有NULL 引用,必须是合法的存储单元引用一旦被使用就不能改变引用的关系。引用其实就是对某个变量的别名, 所以对其修改改的也是其本身。就是恰当的工具做刚好的工作, 指针能随意操作内存的东西但非常危险,如果只是借用一下就可以使用引用sizeof引用得到的是所指对象的大小,而sizeof指针得到的是指针的大小...
2021-10-06 22:35:53
50
原创 深拷贝与浅拷贝
浅拷贝与深拷贝:默认的拷贝构造函数能完成对对象的简单赋值,而对象的资源是由指针指向堆的时候, 简单的复制,会让复制过来的指针指向同一块内存 这就是浅拷贝(会出错同一块内存被释放两次)。深拷贝就是在拷贝构造的时候 使其重新开辟出一块内存去指向新开辟的地方此时两个都指向不同的空间有单独的数据,不会被改变浅拷贝:位拷贝,拷贝构造函数,赋值重载多个对象共用同一块资源,同一块资源释放多次,崩溃或者内存泄漏深拷贝:每个对象共同拥有自己的资源,必须显式提供拷贝构造函数和赋值运算符。缺省拷贝构造
2021-10-06 22:35:18
45
原创 虚函数与纯虚函数(实现函数多态及虚函数讲解)
首先什么是虚函数.虚函数:在继承时,父类希望子类对某些函数进行自适应的改变就将其声明成虚函数举个列子,首先我们假设所有动物都会叫Class Animal{public: void speak(){ cout<<"动物在说话"<<endl;}}; 那么我们派生一个猫类和狗类继承动物的说话方式Class Cat:public Animal{ public: void speak(){cout<<"小.
2021-09-07 11:33:58
185
原创 树(C++)从小白开始(下)
先引入堆的概念以后对哈夫曼树可以更好的理解与操作。什么是堆:优先队列,就是在一个队列中取出元素的顺序不是按照入队的先后顺序,而是数据的优先级。堆的特性,堆是由数组表示的完全二叉树,物理上是用数组,但思维逻辑方向上还是链表。如果任一节点值都大于其左右儿子则成为最大堆,反之为最小堆typedef struct HeapStruct* MaxHeapstruct HeapStruct{ ElementType *Elements; //储存堆元素的数组 int Size; //当前
2021-08-12 15:40:28
75
原创 树(C++)从小白开始(上)
二叉树则是有穷节点的集合,可以为空,由根节点和称为其左子树和右子树的结点的两个不相交的二叉树组成,二叉树的子树有左右之分二叉树中又有特殊的完全二叉树,斜二叉树,完美二叉树(满二叉树)二叉树的定义
2021-08-10 16:18:21
180
原创 二分查找(从零开始的进阶之路 )
首先什么是二分查找。在一段连续的从小到大排序的数组中,我们取中间值,如果中间值小于我们要查找的数(那我们要查找的数在mid的右边)所以我们往右继续取中值继续查找(查找范围缩小一半)代码:int BinarySearch(int nums[],int len,int a){ int left=0; //左边界 int right=len-1;//右边界 int mid; //中值 while(left<=right) { mid=(lef..
2021-08-06 15:07:20
77
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人