![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++学习笔记
文章平均质量分 72
BLFaker84516
热爱编程、热爱生活!各种DIY设计,有想法,有行动!感谢大家关注收藏,不定期分享好项目源码及教程。
下载后,有问题请及时私信沟通,欢迎提问,欢迎来撩!
展开
-
C++二维数组中的查找
该二维数组中的一个数,小于它的数一定在其左边,大于它的数一定在其下边。因此,从右上角开始查找,就可以根据 target 和当前元素的大小关系来快速地缩小查找区间,每次减少一行或者一列的元素。当前元素的查找区间为左下角的所有元素。给定一个二维数组,其每一行从左到右递增排序,从上到下也是递增排序。给定一个数,判断这个数是否在该二维数组中。要求时间复杂度 O(M + N),空间复杂度 O(1)。其中 M 为行数,N 为 列数。原创 2023-11-23 06:45:00 · 325 阅读 · 0 评论 -
C++数组中重复的数字
对于这种数组元素在 [0, n-1] 范围内的问题,可以将值为 i 的元素调整到第 i 个位置上进行求解。在调整过程中,如果第 i 位置上已经有一个值为 i 的元素,就可以知道 i 值重复。在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次。请找出数组中任意一个重复的数字。要求时间复杂度 O(N),空间复杂度 O(1)。因此不能使用排序的方法,也不能使用额外的标记数组。原创 2023-11-23 10:00:00 · 270 阅读 · 0 评论 -
ELF修复基本工作原理
ELF(Executable and Linkable Format)是一种常见的可执行文件和可链接文件的格式,广泛用于Linux和UNIX系统中。ELF修复是指对ELF文件进行修改或修复,以确保其正确加载和执行。ELF修复的基本工作原理如下:识别ELF文件:首先,需要识别和验证目标文件是否为有效的ELF文件。这可以通过检查文件的魔数(Magic Number)来完成,ELF文件的魔数是一个特定的字节序列,用于标识文件格式。原创 2023-08-23 13:45:00 · 266 阅读 · 0 评论 -
数据宽度、KEIL汇编和GNU汇编的区别
导入窗口仅显示二进制文件想要动态加载器自动处理的符号,二进制文件选择使用 dlopen/dlsym 或 LoadLibrary/GetProcAddress 等机制自行加载的符号将不会在导入窗口中显示。导入窗口还提供与 objdump (-T) 、 readelf (-s) 和 dumpbin (/IMPORTS) 等命令行工具类似的功能。因为 IDA 是一种静态分析工具,它无法获知程序在执行时会在这个内存位置输入什么地址。原创 2023-08-22 16:00:00 · 107 阅读 · 0 评论 -
虚函数_虚函数表_虚函数调用_单继承无函数覆盖
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PWxylInr-1692609884858)(https://cdn.jsdelivr.net/gh/nzcv/picgo/20211220214019.png)]通过x10寄存器来确认具体应该调用哪一个函数。覆盖了哪个函数在哪个虚函数表。几个父类几个虚函数表。原创 2023-08-22 10:30:00 · 72 阅读 · 0 评论 -
模板函数实现交换_折半查找_友元函数_运算符重载
C++为了规避指针的灵活性, 使用引用类型达到相同目的, 底层没区别. 但是更加安全。成员函数有this指针, 友元函数没有this指针。原创 2023-08-21 21:45:00 · 117 阅读 · 0 评论 -
对跳表的深入理解
跳表使用空间换时间的设计思路,通过构建多级索引来提高查询的效率,实现了基于链表的“二分查找”。跳表是一种动态数据结构,支持快速地插入、删除、查找操作,时间复杂度都是OlognO(logn)Ologn。跳表的空间复杂度是OnO(n)On。不过,跳表的实现非常灵活,可以通过改变索引构建策略,有效平衡执行效率和内存消耗。虽然跳表的代码实现并不简单,但是作为一种动态数据结构,比起红黑树来说,实现要简单多了。所以很多时候,我们为了代码的简单、易读,比起红黑树,我们更倾向用跳表。原创 2023-03-05 20:27:15 · 272 阅读 · 0 评论 -
递归-需要满足三个条件
递归是一种应用非常广泛的算法(或者编程技巧)。很多数据结构和算法的编码实现都要用到递归,比如DFS深度优先搜索、前中后序二叉树遍历等。去的过程叫“递”,回来的过程叫“归”。基本上所有的递归问题都可以用递推公式来表示。递归需要满足的三个条件一个问题的解可以分解为几个子问题的解;这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样;存在递归终止条件。递归是一种非常高效、简洁的编码技巧。只要是满足“三个条件”的问题就可以通过递归代码来解决。但是递归代码也比较难写、难理解。原创 2023-03-05 20:27:57 · 1335 阅读 · 0 评论 -
非线性表数据结构_图的表示
邻接矩阵存储方法的缺点是比较浪费空间,但是优点是查询效率高,而且方便矩阵运算。邻接表存储方法中每个顶点都对应一个链表,存储与其相连接的其他顶点。尽管邻接表的存储方式比较节省存储空间,但链表不方便查找,所以查询效率没有邻接矩阵存储方式高。针对这个问题,邻接表还有改进升级版,即将链表换成更加高效的动态数据结构,比如平衡二叉查找树、跳表、散列表等。原创 2023-03-04 21:58:54 · 578 阅读 · 0 评论 -
广度和深度优先搜索解析与示例代码
算法是基于特定数据结构之上的,深度优先搜索算法和广度优先搜索算法都是基于“图”这种数据结构的。树是图的一种特例(连通无环的图就是树)。图上的搜索算法,最直接的理解就是,在图中找出从一个顶点出发,到另一个顶点的路径。具体方法有很多,两种最简单、最“暴力”的深度优先、广度优先搜索,还有A*IDA*等启发式搜索算法。深度优先搜索算法和广度优先搜索算法,既可以用在无向图,也可以用在有向图上。图(采用邻接表存储)的C++# include // 无向图结构的定义 class Graph {原创 2023-03-04 21:49:56 · 329 阅读 · 0 评论 -
笔试中对链表题的总结
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4iOeojOe-1677858146436)(…/…/data/images/circle.png)]对于链表环的问题,潜在的一个结论是从快慢指针的相遇点到环的入口节点B的距离和头节点到环的入口节点B的距离是相等的,即ABCBAB = CBABCB。具体证明可以通过以下两种方法分析:先设两个指针:快指针fast(比慢指针多走一步)和慢指针slow,链表有环的前提下,它们必然相遇,假设相遇于节点C。因为fast。原创 2023-03-03 23:43:16 · 376 阅读 · 0 评论 -
搞清楚动态库和静态库的区别
一般来说,一个程序,通常都会包含目标文件和若干个库文件。经过汇编得到的目标文件再经过和库文件的链接,就能构成可执行文件。库文件像是一个代码仓库或代码组件的集合,为目标文件提供可直接使用的变量、函数、类等。库文件包含了静态链接库和动态链接库两种。两者最根本的区别在与在程序编译的过程中,如何处理库文件和目标文件的链接关系。原创 2023-02-15 23:11:15 · 142 阅读 · 0 评论 -
动态库和静态库的区别
一般来说,一个程序,通常都会包含目标文件和若干个库文件。经过汇编得到的目标文件再经过和库文件的链接,就能构成可执行文件。库文件像是一个代码仓库或代码组件的集合,为目标文件提供可直接使用的变量、函数、类等。库文件包含了静态链接库和动态链接库两种。两者最根本的区别在与在程序编译的过程中,如何处理库文件和目标文件的链接关系。原创 2023-02-14 23:40:17 · 292 阅读 · 0 评论 -
一文弄懂硬链接、软链接、复制的区别
原理:每对file1增加一个硬连接,系统对file1的对应的inode(硬盘数据节点)的连接数加一。当删除file1或file2等其它硬连接时,对磁盘对应的数据节点连接数减一,只有当连接数为0时,才真正的删除数据。**但是A的数据块中存放的只是B的路径名(**可以根据这个找到B的目录项)。A和B之间是“主从”关系,如果B被删除了,A仍然存在(因为两个是不同的文件),但指向的是一个无效的链接。若强行编辑file2并保存,系统会生成文件file1,内容为file2编辑的内容。修改file2,file1会变。原创 2023-02-14 23:40:44 · 532 阅读 · 0 评论 -
【C++学习总结】如何禁止类被其他类继承
如果是仅仅为了达到这个目的可以直接把这个类的构造函数设置成私有的,这样就杜绝了其他类的继承。也相当于毁掉了这个类(无法再创造出自己的对象)。那么怎么样既要保证这个类的完整性,又防止其他类的继承呢?如何在防止一个类被其他的类继承呢?原创 2023-02-14 23:39:01 · 216 阅读 · 0 评论 -
C++中extern、static、const、volatile等关键字详解
作用静态变量只初始化一次,未初始化的静态变量会默认初始化为0。静态全局变量只在本文件可见,外部文件无法访问。而静态局部变量只在定义的作用域内可见,但他们的生存周期都是整个程序运行时期。static修饰的函数只允许在当前文件中使用,在其他文件中无法找到该函数的地址。不可以被其他文件引用,且不会与其他文件中的同名函数冲突。常对象:常函数:顶层const和底层const1.顶层const表示指针本身是一个常量。(指针常量)int i = 0;int *const p1 = &i;const int ci =原创 2023-02-13 23:36:50 · 443 阅读 · 0 评论 -
了解一下C++命名规范
(详细介绍类变量如何命名)原创 2023-02-13 23:35:57 · 383 阅读 · 0 评论 -
【C++笔试问答】处理各种输入输出的解决方法
注意:数组的最后一个字符会是‘\0’,设接收字符数目为n,如果输入的字符串大于等于n,则实际接收到的输入是字符串的前面n-1个字符,包括空格(不包括回车,遇到回车就结束了),会自动在后面增加一个‘\0’。2、输入的是带空白的字符串,这种情况比较可恶,因为 scanf 和 cin 都是读到空白就结束的,这时候就得使用上面知识点讲到的 getline(cin, string s) 来读取了。cin.get(字符变量符),用来接收字符,只获取一个字符,可以接收空格,遇到回车便结束。,最后一个字符为‘\0’。原创 2023-02-13 23:34:04 · 367 阅读 · 0 评论 -
【c++面试问答】常量指针和指针常量的区别
②对于 int *const p2=&c,现将const和p2结合,即p2首先是一个常量,然后再左结合*,即指针常量,它本身是一个常量,因此我们不能改变p2本身。另外因为p2本身是const,而const必须初始化,因此p2在定义时必须初始化,即不能直接 int *const p2;①对于 int const *p1=&b,先将*和p1结合,即p1首先是一个指针,然后再左结合const,即常量指针,它指向了const对象,因此我们不能改变 *p1的值。指针(*)和常量(const)谁在前先读谁;原创 2023-02-12 19:20:42 · 1826 阅读 · 3 评论 -
【C++面试问答】虚函数可以声明为inline吗
在程序中的每个调用点将函数体展开,而不是按照通常的函数调用机制取调用,从而减少调用函数花费的额外开销。虚函数一般不能声明为inline的,因为inline函数是在编译期将函数内容替换到函数调用处的,是静态编译的。● 通常只有函数非常短小的时候(如10行代码内)才适合定义成inline函数,否则会导致程序变慢。● 定义在class内的成员函数默认是inline函数(虚函数除外),因为虚函数是在运行时动态调用的,编译器并不知道它绑定的是哪个对象。● (缺点)inline函数会增加执行文件的大小。原创 2023-02-12 19:19:08 · 1078 阅读 · 0 评论 -
【C++面试问答】搞清楚深拷贝与浅拷贝的区别
C++中,浅拷贝不需要自己实现,编译器会自动生成缺省的拷贝构造函数,浅拷贝新旧对象共享一块内存,任何一方的值改变都会影响另一方;深拷贝需要自己手动编写拷贝构造函数,深拷贝新旧对象不共享内存。原创 2023-02-11 22:14:22 · 2609 阅读 · 1 评论 -
【c++面试问答】全局变量和局部变量的区别
● 使得静态局部变量内存分配在静态数据区,导致延长了生命周期。● 使得静态全局变量无法被其他文件使用,局限了其文件对外链接。C++中的全局变量和局部变量有什么区别?中也有过总结,这里再汇总一下。注:内容全部参考自文末的参考资料。这部分内容在C++问题。原创 2023-02-11 22:12:39 · 585 阅读 · 0 评论 -
【C++面试问答】strcpy_strncpy_memcpy的区别
将字符串 src 中最多 n 个字符复制到字符数组 dest 中(它并不像 strcpy 一样只有遇到 NULL 才停止复制,而是多了一个条件停止,就是说如果复制到第 n 个字符还未遇到 NULL,也一样停止),返回指向 dest 的指针。只适用于字符串拷贝。:strcpy 是不安全的,strcpy 在遇到结束符时才会正常的结束运行,会因为 src 长于 dest 而造成 dest 栈空间溢出以致于崩溃异常,它的结果未定,可能会改变程序中其他部分的内存的数据,导致程序数据错误,不建议使用。原创 2023-02-10 08:17:34 · 227 阅读 · 0 评论 -
【C++面试笔记】sizeof与strlen的区别
这个例子是结构体的内存对齐所导致的,计算结构变量的大小就必须讨论数据对齐问题。为了CPU存取的速度最快(这同CPU取数操作有关,详细的介绍可以参考一些计算机原理方面的书),C语言在处理数据时经常把结构变量中的成员的大小按照4或8的倍数计算,这就叫。这样做可能会浪费一些内存,但理论上速度快了。当然这样的设置会在读写一些别的应用程序生成的数据文件或交换数据时带来不便。sizeof 与 strlen 的区别与使用详解。这算是 C++ 中基础中的基础了,很容易被考到。原创 2023-02-10 08:16:41 · 1627 阅读 · 1 评论 -
【C++学习笔记】析构函数彻底理解
虚函数对应一个vtable(虚函数表),类中存储一个vptr指向这个vtable。如果构造函数是虚函数,就需要通过vtable调用,可是对象没有初始化就没有vptr,无法找到vtable,所以构造函数不能是虚函数。下面的不用看了在14_虚函数详解那一节中也有提到,构造函数不能是虚函数,原因是构造函数在创建对象时必须确定对象类型。具体的理解就是:①首先,在创建一个对象时必须确定其类型。因为类型规定了对象可以进行哪些操作,所以创建对象时必须确定类型,以防止一些不恰当的操作,否则编译器就会报错。原创 2023-02-09 23:59:37 · 567 阅读 · 0 评论 -
【C++学习笔记】纯虚函数
因此没有函数体。● 纯虚函数的声明只需在虚函数形参列表后面。原创 2023-02-09 23:58:41 · 345 阅读 · 0 评论 -
【数据结构与算法】7种经典的排序算法原理及C++实现源码
主要的思想就是在每个非叶子节点上,都把其左右孩子中最大的孩子取出来,并让它往上移动,这也是为什么要自底向上构建的原因,先把最底层的元素中较大的往上移,再把倒数第二层较大的元素往上移,逐层向上,就可以保证每个父节点的值都大于其孩子节点的值,也就满足了大顶堆的性质。②选出左右子节点中较大的节点,与父节点比较,若父节点小,则将较大的子节点放在父节点的位置,但不是交换(相当于每向下一层都试图把较大的孩子对应的元素往上移,当不能继续向下时,就把之前保存的根节点值temp填补在最终位置)原创 2023-02-08 21:58:46 · 667 阅读 · 0 评论