- 博客(117)
- 收藏
- 关注
原创 Linux 开发工具
g++ -c 是编译 C++ 程序时的常用命令组合,主要用于将源代码转换为目标文件(object file)也就是机器能识别的二进制编码,但不进行链接操作。像这样 我们不仅可以查看我们自己生成的a.out文件所依赖的动态库 同时也可以查看 一些指令所依赖的动态库 毕竟linux里面一切皆文件嘛!我们发现 无论是cpp文件还是说cpp预处理后的文件还是说编译后的文件 我们都可以用-c。如果是动态库 就是我们把我们要printf的内容去到这个动态库里面处理。我们的机器上一般会默认安装动态库 不会安装静态库。
2025-05-29 21:21:34
663
原创 C++ RB_Tree
这种平衡策略被称为 "弱平衡",相较于严格平衡的 AVL 树,它允许节点间的高度差不超过两倍,从而减少了旋转操作的频率,提升了动态数据操作的效率。这个 "黑色高度" 的一致性,保证了树的最长路径不超过最短路径的 2 倍(因为红色节点不能连续出现,最长路径 = 黑色高度 + 红色节点数,而红色节点数≤黑色高度)。任何红色节点的左右子节点必须为黑色,防止出现 "红 - 红" 相邻的情况,这是维持平衡的关键约束。这里的叶子节点指的是 NIL 空节点(外部节点),所有真实节点的叶子都指向这些黑色哨兵节点。
2025-05-29 21:21:02
396
原创 Linux 工具
我们平时下载软件基本都是到应用下载 那么应用商店里面本质上存放的是什么?本质上存放的是都是每个软件的下载链接那么同样我们linux里面也可以下载软件那么我们首先要下载软件 我们要检查网络是否连接。
2025-05-06 14:27:18
814
原创 C++ Avl_Tree
AVL树本质上是在搜索二叉树的情况下改造的搜索二叉树的缺点是 最坏的时候效率太低容易演变成链表AVL树对搜索二叉树的这个痛点进行了改造解决方案就是旋转通过旋转AVL树可以做到左右每个子树高度可以不超过1要了解旋转 我们首先要了解平衡因子。
2025-05-06 14:26:46
784
原创 C++ 快速幂算法
暴力算法当然是遍历for循环 循环n遍 但是这样时间复杂度就是O(n) 效率太低了。就是偶数了 这样我们就可以把时间复杂度降低到O(logn)就可以了 这个矩阵的n次方 我们就可以用上快速幂的代码了。F(1) F(0)是已知的 我们只用求。如果是n奇数 我们可以把a存下来 计算。我们来看一个实际应用 斐波那契数列。我们当然可以用动态规划取写它 同时。这样我们就只用计算4次就可以了。我们思考一个问题我们怎么计算。答案是有的 就是快速幂的算法。但是如果n是奇数次方怎么办?有没有更简单的办法?
2025-04-22 16:36:31
320
原创 Linux 入门指令(2)
比如这个地方我就指定在 /usr/bin/ 路径下查找 pwd这个文件(Linux一切指令都是可执行文件)比如这里 我输了一个cal -y 2025 就会自动显示2025日历的信息 同时标明今天的日期。.c文件会编译生成一个.out文件 我们就可以在当前(./)路径下去运行这个.out可执行文件。像这个地方 我直接whereis ls 他就会把ls命令相关的文件全部给我找到。比如说我这个地方ctrl r ll 就会打印出我使用过的ll指令。因为这个时间戳转化的时间是当地的时间差!
2025-04-17 17:49:27
793
原创 Linux 权限
在一个共享目录中,多个用户可能都有写入和删除文件的权限,设置了粘滞位之后,只有文件的所有者、目录的所有者或者超级用户(root)才能删除或重命名该目录下的文件。我希望这个文件是可以被写入的 但是同时我又担心我朋友把我重要的文件删了 我不想给他删除的权限 这个时候怎么办?那么怎么更改所属组和拥有者呢?答案是不可以的 因为每个用户只能有一个身份 如果是拥有者就不能是所属组了!4是所属组的权限 转换成二进制也就是 100 也就是r--我们在文件上就可以看见 不同人+不同的属性 就是我们的权限。
2025-04-17 17:48:15
1059
原创 C++ 异常
传统C语言处理错误有两种方式“1.终止程序,如assert,缺陷:用户难以接受。如发生内存错误,除0错误时就会终止程序。2.返回错误码缺陷:需要程序员自己去查找对应的错误。如系统的很多库的接口函数都是通过把错误码放到errno中,表示错误实际中C语言基本都是使用返回错误码的方式处理错误,部分情况下使用终止程序处理非常严重的错误。
2025-04-06 00:39:33
929
原创 C++ 排序(2)
这个问题我们要进行分类讨论 直接对相遇情况讨论即可无需对过程进行讨论因为过程会发生交换 交换会进行交换调整使其又开始right先走 找小 然后了left找大 就是一个新的循环了!right先走1.right找到小的 left没有 找到大的 left遇到right这个时候right是小的 所以相遇的点是2.right没有找到小的 直到遇到left 这个时候的left(1)一步都没走的left的 也就是相遇点和key相同(2)走过一步及以上的left 也就是相遇点比key小。
2025-04-06 00:39:11
891
原创 C++ KMP算法·
问题:(主串) m个数据s2="issip"(子串 ) n个数据我怎么才确认在s1中是否存在s2呢?当然我们一眼可以看出来 那计算机怎么办?暴力方法:我们首先在主串中找到 和子串首字符相同的字符s1="mii为指针指向的位置 该指针设为ptr1)s2="issip"" (i为指针指向的位置 该指针设为ptr2)然后我们ptr1 ptr2 同时走 会出现三种情况。
2025-04-05 13:19:59
1211
原创 C++ 多态(3)
抽象类是虚函数等于0 实现的 抽象类的作用是 简介强制实现重写在同一个作用域内,函数名相同但参数列表不同(参数的类型、个数或顺序不同)的函数可以同时存在,编译器会根据调用时传递的实参类型和数量来选择合适的函数进行调用。在继承体系中,派生类定义了一个与基类虚函数具有相同函数名、参数列表和返回值类型(协变返回类型除外)的函数,并且使用 override 关键字(可选但推荐)来明确表示这是对基类虚函数的重写。当通过基类指针或引用调用该虚函数时,会根据对象的实际类型调用派生类的重写函数,实现运行时多态。
2025-03-17 08:00:00
306
原创 思考:this指针
哪怕你这函数功能的实现不需要this指针 它也会传 C++把this指针统一交给编译器处理。我们会发现 this 指针是一个很特立独行的东西 类对象调用函数都要传它。因为你派生类你调用的虚函数函数头虽然是基类的 但是this指针 一定是派生类。而且类对象的函数调用的时候 编译器都会去传this指针 这样可以统一。因为你派生类重写的虚函数很可能要用到派生类特有的成员。多态里面的this指针。
2025-03-16 08:00:00
213
原创 C++ map/set (2)
map和set返回值都是pair函数pair的first是迭代器 second是布尔值 插入成功就是true 失败就是false我们写一个map统计元素出现的次数 但是很麻烦那么有没有更简单的方法呢?答案是有 就是operator[]
2025-03-11 14:29:12
498
原创 C++ Binary_Search _Tree(1)
我们Erase 首先要找到我们要删的东西在不在 如果我们要删除一个不存在的东西那肯定是直接返回false找的规则符合搜索二叉树的性质即我们再来思考找到了要删的点有哪几种情况1. 左子树的值为空2.右子树的值为空3.左右子树的值都不为空(1)左子树为空(左节点为空)左子树删除的时候 我们要注意两点就算右子树也是空也可以链接但是我们再思考一些特殊情况 比如删除的是根呢?如果删除的是根 它不就没有父节点吗?那上面两点是不是就不成立 这种情况我们就要去单独写了!那很简单。
2025-03-06 08:30:00
886
原创 C++ map/set(1)
map和set就是二叉树的value和key模型map是value模型 set是key模型map和set都是基于红黑树实现的红黑树具有平衡性质那么思考一下 算法库里面的find函数和STL里面的find函数有什么区别。
2025-03-06 08:30:00
700
原创 C++继承(2)
高内聚则是指模块内部的各个元素都是紧密相关的,共同完成一个明确的功能。思考:这个地方 B C都不会去调用A构造 那么B C 的:S(sa)(显示调用)可不可以去掉?答案是:不可以 因为D里面的A(原理和下图一致)既不在B里面也不在C里面 不能依靠B和C来。而且是最A先构造的 D是最后构造的 因为A是B C的基类 B C是D的基类。像这个代码 先继承的是B 所以B比C先调用构造函数。A B C D各构造一次 顺序是A->B->C->D。那么A的A(sa)可不可以去掉呢?组合的耦合度低 继承的耦合度高。
2025-02-12 08:00:00
347
原创 C++多态
这个地方的虚函数的virtual和前面虚拟继承的关键字virtual没有任何关联只有成员函数才可以变成虚函数虚函数可以完成重写(覆盖)虚函数就是在函数前面+一个virtual 我们先来看这串代码 很神奇func接受Person匿名对象和Student的匿名对象的切片(接收类型是Person)但是调用的确是不同的BuyTicket正常来说这个地方是p去调用BuyTicket()但是这个地方p是Person类型 所以按照隐藏来算 调用的也应该是Person::name;但是这个地方我们不+Student::它
2025-02-12 08:00:00
959
原创 C++ 继承(1)
这个地方函数的同名要和函数重载区分一下首先函数重载是在同一个域中这个地方的函数同名是处于两个不同的域我们直接上代码就很容易理解了。
2025-02-09 23:13:02
617
原创 C++模板进阶
这个地方为什么push不行?原因是push没有实例化 编译器怎么知道这个T是什么类型 怎么生成地址给call呢?怎么解决?在函数定义的文件显示实例化template但是这个方式有坑如果我要的不算stack<int>而是stack<double>呢?那就要再写一个,治标不治本!最好的办法就是把定义和声明写在同一个文件内。
2025-02-09 08:00:00
686
原创 C++ 反向迭代器
3.反向迭代器的++相当于正向迭代器的-- 反向迭代器的--相当于正向迭代器的++1.迭代器的rebegin()是在最后一个元素的末尾(和正向迭代器保持一致)2.因此反向迭代器的解引用是解引用当前位置前一个位置的元素。反向迭代器不难 但是有些地方还是需要注意一下。4.这个反向迭代器是适用于不同容器的。
2025-02-04 16:19:06
220
原创 C++ 仿函数
因此我们在这个地方要根据Date大小去建堆就只能自己写一个仿函数了。仿函数可以当作模板使用,因为每个仿函数都拥有自己的类型。仿函数返回值类型是bool数据类型 称为谓词。仿函数本质上就是类+operator()仿函数比函数更灵活 有自己的数据和成员变量。仿函数比函数指针执行的更快(大多数情况下)缺点在于定义的时候需要定义在一个类里面。像这个地方我们对于Date*这个类型。但是我每次new的地址的大小是随机的。我们在有些情况下 必须要用仿函数。看上去仿佛是函数 实际是类。仿函数可以当作参数传递。
2025-02-04 16:05:59
352
原创 C++ priority_queue
但是什么时候要用比如像这样sort(pq.begin(),pq.end(),greater<int>())sasadasssas优先队列和队列是在同一个头文件中 也就是#include<queue>如果要小堆的话那就要改第三个参数了(也就意味着第二个参数我们就要自己写了)函数模板要传对象 所以这里本质上是一个匿名对象greater<int>()这个地方是类模板要传的是参数 参数是什么?我们思考一下 这个地方greater<int>后面要不要加括号?仿函数模拟的是C语言里面的函数指针。
2025-01-30 22:41:10
46
原创 C++ deque(1)
deque的扩容不像vector那样麻烦 直接新开一个buffer 不用重新开空间再把数据全部移过去deque本质上是一个指针数组和vector<vector>不一样,vector<vector>本质上是一个vector对象数组!并且vector<vector>的buffer是不一样大的 而deque的每个buffer大小是固定的指针数组满了之后直接扩容就可以了,并且代价很低基本可以忽略不记(只用拷贝指针数组的全部指针就可以了)数据插入的时候 优先往中间插入 因为这样你尾插和头插就不用去挪动数据了!
2025-01-30 06:00:00
654
原创 C++ queue
因为队列是先进先出 vector没有提供头删(效率太低)要强制适配也可以 就得用erase函数和begin函数了。库里面的队列是不支持vector<int>的。队列用vector<int>好不好。
2025-01-29 21:41:25
228
原创 C++ stack
所以我们在自己实现stack的top函数的时候 是不能直接返回_container[0](链表不能用[])这个时候就可以用back这个函数了 因为无论是vector还是list都有front和list的接口。stack不需要迭代器 因为 栈是不能随便遍历的 因此方括号也不能用。因为对于自定义类型 编译器会调用它们的默认构造!这个地方不用写析构函数 构造函数和拷贝赋值等。
2025-01-29 16:24:56
257
原创 C++ list
这个版本的 splice 会将列表 x 中由迭代器 first 和 last 定义的范围内的元素移动到 position 所指向的位置。splice 函数是C++标准模板库(STL)中的 list 容器的一个功能强大的方法,它允许将元素从一个列表移动到另一个列表,而不需要创建新元素,从而优化性能。通过调用 sort() 方法对列表进行排序,然后使用 std::unique 处理重复的相邻元素,并通过 erase() 方法删除这些重复元素。最终,输出的是一个不包含相邻重复元素的列表。
2025-01-27 06:30:00
1344
原创 C++ vector(1)
(此时 it 指向元素 3 ),执行 v.erase(it) 后,原来指向元素 4 ( it + 1 )的迭代器现在指向了元素 5 ,这就导致了迭代器的逻辑错误。因为string里面的find可能是找一个字符串也可能是找一个字符,包括在哪些范围内寻找,要求比vector的find要高,因此string的vector是单独实现的,而vector包括后面的list那些都用的是算法里面的那个find。因为元素的移动,原本指向后面元素的迭代器现在指向的是其他元素了。要注意在插入操作前后更新迭代器。
2025-01-15 08:45:00
716
原创 暑期Matlab(1)
19.A[1 2 3] B[1,2,3] A(3) 表示A矩阵的第三个元素 B(2)表示B矩阵的第二个元素。20.比如我们要输入一个矩阵A[1 2 3 ... 100]如果我们要一个一个输,就会很麻烦 我们可以直接。比如C矩阵是一个3乘3的矩阵,我如果想表示第三行第二列的元素 我直接C(3,2)就可以了。A(3,:)=[]我直接把A矩阵的第三行所有元素置为空不就相当于删掉了A矩阵的第三行了嘛!max(A)表示A矩阵每一列的最大的元素构成的矩阵(如果只有一行或者一列则会求出其最大值)
2025-01-15 08:00:00
793
算法领域蓄水池抽样算法解析:数据流随机采样方法及其概率计算详解
2025-05-29
【数据结构与算法】红黑树变色与旋转
2025-05-29
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人