- 博客(47)
- 收藏
- 关注
原创 【Linux】Linux权限(一)
1. 目录的可执行权限,表示你能否在目录下执行命令。2. 如果目录没有 -x 权限,则无法对目录执行任何命令,甚至无法 cd 进入目录,即使目录仍然有 -r 读权限(这个地方很容易出错,认为有读权限就可以进入目录读取目录下的文件)。3. 而如果目录具有 -x 权限,但没有 -r 权限,则用户可以执行命令,可以 cd 进入目录。但由于没有目录的读权限,4. 所以在目录下,即使可以执行 ls 命令,但仍然没有权限读出目录下的文档。
2026-01-11 08:00:00
426
原创 【Linux】基本指令收尾(下)
你看上了小美,但是有不好意思直接表白,那就让你你家人找媒婆帮你提亲,所有的事情你都直接跟媒婆沟通,由媒婆转达你的意思给小美,而我们找到媒婆姓王,所以我们叫它王婆,它对应我们常使用的bash。另外,他也可以⽤来取代exit。/usr/local/src 底下,并且解开 /tmp/etc.tar.gz ,则解开的⽬录会在 /usr/local/src/etc 呢!⽹络操作命令:ifconfig、ip、ping、netstat、telnet、ftp、route、rlogin、rcp、finger、
2026-01-10 17:08:01
512
原创 【Linux】linux下常见指令(不晓得写啥)
在运⾏⼀个⾮常消耗资源的find命令时,很多⼈都倾向于把它放在后台执⾏,因为遍历⼀个⼤的⽂件系统可能会花费很⻓的时间(这⾥是指30G字节以上的⽂件系统)。task就是进程,其实准确的翻译应该是“任务”,国内叫“进程”,主要是“任务”两个字没有动态感,而进程有。date-s“2008-05-23 01:01:01" //这样可以设置全部时间。date-s“01:01:012008-05-23" //这样可以设置全部时间。date-s“20080523 01:01:01" //这样可以设置全部时间。
2025-12-28 08:00:00
879
原创 【linux】linux下常见指令(中)
当第⼆个参数类型是⽂件时,mv命令完成⽂件重命名,此时,源⽂件只能有⼀个(也可以是源⽬录名),它将所给的源⽂件或⽬录重命名为给定的⽬标⽂件名。若源⽂件或⽬录的形态,不属于⽬录或符号链接,则⼀律视为普通⽂件处理。当第⼆个参数是已存在的⽬录名称时,源⽂件或⽬录参数可以有多个,mv命令将各参数指定的源⽂件均移⾄⽬标⽬录中。视mv命令中第⼆个参数类型的不同(是⽬标⽂件还是⽬标⽬录),mv命令将⽂件重命名或将其移⾄⼀个新的⽬录中。如同时指定两个以上的⽂件或⽬录,且最后的⽬的地是⼀个已经存在的⽬录,则它会把前⾯指定。
2025-12-26 08:00:00
848
原创 【Linux】Linux下常见指令(上)
功能:touch命令参数可更改⽂档或⽬录的⽇期时间,包括存取时间和更改时间,或者新建⼀个不存在的⽂件。-F 在每个⽂件名后附上⼀个字符以说明该⽂件的类型,“*”表⽰可执⾏的普通⽂件;对于⽬录,该命令列出该⽬录下的所有⼦⽬录与⽂件。-d 将⽬录像⽂件⼀样显⽰,⽽不是显⽰其下的⽂件。-s 在l⽂件名后输出该⽂件的⼤⼩。-p 当⼦⽬录被删除后如果⽗⽬录也变成空⽬录的话,就连带⽗⽬录⼀起删除。-a 列出⽬录下的所有⽂件,包括以 . 开头的隐含⽂件。功能:在当前⽬录下创建⼀个名为 “dirname”的⽬录。
2025-12-24 08:00:00
809
原创 【linux】初识及其背景
据权威部⻔统计,⽬前Linux在服务器领域已经占据75%的市场份额,同时,Linux在服务器市场的迅速崛起,已经引起全球IT产业的⾼度关注,并以强劲的势头成为服务器操作系统领域中的中。Linux在桌⾯领域的发展近年来,特别在国内市场,Linux桌⾯操作系统的发展趋势⾮常迅猛。那是因为总有人会为爱发电,就像C++委员会那样,还有一个就是在那个年代能写代码的都是顶级人才,像那样的天才大多都不会缺钱,物质上的需求基本满足了,就开始追求精神上的满足了,而操作系统这玩意儿可是真正能改变世界的东西。
2025-12-23 08:00:00
707
原创 【c++】智能指针的使用及其原理
内存泄漏指因为疏忽或错误造成程序未能释放已经不再使⽤的内存,⼀般是忘记释 放或者发⽣异常释放程序未能执⾏导致的。内存泄漏并不是指内存在物理上的消失,⽽是应⽤程序分 配某段内存后,因为设计错误,失去了对该段内存的控制,因⽽造成了内存的浪费。
2025-12-22 08:00:00
565
原创 【c++】异常
异常处理机制允许程序中独⽴开发的部分能够在运⾏时就出现的问题进⾏通信并做出相应的处理,异常使得我们能够将问题的检测与解决问题的过程分开,程序的⼀部分负责检测问题的出现,然后解决问题的任务传递给程序的另⼀部分,检测环节⽆须知道问题的处理模块的所有细节。抛出异常后,程序暂停当前函数的执⾏,开始寻找与之匹配的catch⼦句,⾸先检查throw本⾝是否在try块内部,如果在则查找匹配的catch语句,如果有匹配的,则跳到catch的地⽅进⾏处理。出异常,则也需要捕获处理,否则后⾯的5个资源就没释放,也资源泄漏了。
2025-12-21 08:00:00
744
原创 【c++】c++11(下)
当使⽤混合捕捉时,第⼀个元素必须是&或=,并且&混合捕捉时,后⾯的捕捉变量必须是值捕捉,同理=混合捕捉时,后⾯的捕捉变量必须是引⽤捕捉。对于⼀个参数包,我们除了能计算他的参数个数,我们能做的唯⼀的事情就是扩展它,当扩展⼀个包时,我们还要提供⽤于每个扩展元素的模式,扩展⼀个包就是将它分解为构成的元素,对每个元素应⽤模式,获得扩展后的列表。arg_list中的参数可能包含形如_n的名字,其中n是⼀个整数,这些参数是占位符,表示newCallable的参数,它们占据了传递给newCallable的参数的位置。
2025-12-20 08:00:00
654
原创 【c++】c++11(上)
C++11以后,分别重载左值引⽤、const左值引⽤、右值引⽤作为形参的f函数,那么实参是左值会匹配f(左值引⽤),实参是const左值会匹配f(const 左值引⽤),实参是右值会匹配f(右值引⽤)。像f2这样的函数模板中,T&& x参数看起来是右值引⽤参数,但是由于引⽤折叠的规则,他传递左值时就是左值引⽤,传递右值时就是右值引⽤,有些地⽅也把这种函数模板的参数叫做万能引⽤。第⼀个语句就是左值引⽤,左值引⽤就是给左值取别名,第⼆个就是右值引⽤,同样的道理,右值引⽤就是给右值取别名。
2025-12-19 14:59:39
792
原创 【c++】用哈希表封装myunordered_map和myunordered_set
SGI-STL30版本源代码中没有unordered_map和unordered_set,SGI-STL30版本是C++11之前的STL版本,这两个容器是C++11之后才更新的。全类似,复⽤同⼀个hashtable实现key和key/value结构,hash_set传给hash_table的是两个key,hash_map传给hash_table的是pair<const key, value>需要注意的是源码⾥⾯跟map/set源码类似,命名⻛格⽐较乱,这⾥⽐map和set还乱,hash_set。
2025-12-19 08:00:00
594
原创 【c++】哈希表实现
如果是2^x ,那么key %2^x本质相当于保留key的后X位,那么后x位相同的值,计算出的哈希值都是⼀样的,就冲突了。当key是string/Date等类型时,key不能取模,那么我们需要给HashTable增加⼀个仿函数,这个仿函数⽀持把key转换成⼀个可以取模的整形,如果key可以转换为整形并且不容易冲突,那么这个仿函数就⽤默认参数即可,如果这个Key不能转换为整形,我们就需要⾃⼰实现⼀个仿函数传给这个参数,实现这个仿函数的要求就是尽量key的每值都参与到计算中,让不同的key转换出的整形值不同。
2025-12-18 08:00:00
539
原创 【c++】封装红黑树实现mymap和myset
其次因为RBTree实现了泛型不知道T参数导致是K,还是pair<K, V>,那么insert内部进⾏插⼊逻辑 ⽐较时,就没办法进⾏⽐较,因为pair的默认⽀持的是key和value⼀起参与⽐较,我们需要时的任 何时候只⽐较key,所以我们在map和set层分别实现⼀个MapKeyOfT和SetKeyOfT的仿函数传给 RBTree的KeyOfT,然后RBTree中通过KeyOfT仿函数取出T类型对象中的key,再进⾏⽐较,具体 细节参考如下代码实现。之前使⽤部分,我们分析了,map和set的迭代器⾛。
2025-11-29 18:00:00
838
原创 【c++】红黑树实现
分析:因为p和u都是红⾊,g是⿊⾊,把p和u变⿊,左边⼦树路径各增加⼀个⿊⾊结点,g再变红,相当于保持g所在⼦树的⿊⾊结点的数量不变,同时解决了c和p连续红⾊结点的问题,需要继续往上更新是因为,g是红⾊,如果g的⽗亲还是红⾊,那么就还需要继续处理;c为红,p为红,g为⿊,u不存在或者u存在且为⿊,u不存在,则c⼀定是新增结点,u存在且为⿊,则c⼀定不是新增,c之前是⿊⾊的,是在c的⼦树中插⼊,符合情况1,变⾊将c从⿊⾊变成红⾊,更新上来的。如果是空树插⼊,新增结点是⿊⾊结点。
2025-11-22 10:09:32
786
原创 【c++】AVL树
更新后parent的平衡因⼦等于2 或 -2,更新前更新中parent的平衡因⼦变化为1->2 或者 -1->-2,说明更新前parent⼦树⼀边⾼⼀边低,新增的插⼊结点在⾼的那边,parent所在的⼦树⾼的那边更⾼了,破坏了平衡,parent所在的⼦树不符合平衡要求,需要旋转处理,旋转的⽬标有两个:1、把parent⼦树旋转平衡。通过下图可以看到,左边⾼时,如果插⼊位置不是在a⼦树,⽽是插⼊在b⼦树,b⼦树⾼度从h变成h+1,引发旋转,右单旋⽆法解决问题,右单旋后,我们的树依旧不平衡。
2025-11-08 18:00:00
1484
原创 【c++】unordered_set和unorder_map的使用
•unordered_set的声明如下,Key就是unordered_set底层关键字的类型•unordered_set默认要求Key⽀持转换为整形,如果不⽀持或者想按⾃⼰的需求⾛可以⾃⾏实现⽀持将Key转成整形的仿函数传给第⼆个模板参数•unordered_set默认要求Key⽀持⽐较相等,如果不⽀持或者想按⾃⼰的需求⾛可以⾃⾏实现⽀持将Key⽐较相等的仿函数传给第三个模板参数•unordered_set底层存储数据的内存是从空间配置器申请的,如果需要可以⾃⼰实现内存池,传给第四个参数。
2025-11-06 08:00:00
1024
原创 【c++】map和set的使用
•set的声明如下,T就是set底层关键字的类型。•set默认要求T⽀持⼩于⽐较,如果不⽀持或者想按⾃⼰的需求⾛可以⾃⾏实现仿函数传给第⼆个模版参数。•set底层存储数据的内存是从空间配置器申请的,如果需要可以⾃⼰实现内存池,传给第三参数。•⼀般情况下,我们都不需要传后两个模版参数。•set底层是⽤红⿊树实现,增删查效率是O(logN) ,迭代器遍历是⾛的搜索树的中序,所以是有序的。•。
2025-11-05 08:00:00
724
原创 【c++】二叉搜索树
树不空,按⼆叉搜索树性质,插⼊值⽐当前结点⼤往右⾛,插⼊值⽐当前结点⼩往左⾛,找到空位置,这里我们可以加入一个父节点,初始状态置为空,在循环里面不断更新父节点始终为cur的父节点位置,保证循环结束后cur为空,parent为最后一个节点,再将cur的值更新为要插入的值,最后用parent插⼊新结点cur。场景2:商场⽆⼈值守⻋库,⼊⼝进场时扫描⻋牌,记录⻋牌和⼊场时间,出⼝离场时,扫描⻋牌,查找⼊场时间,⽤当前时间-⼊场时间计算出停⻋时⻓,计算出停⻋费⽤,缴费后抬杆,⻋辆离场。
2025-10-26 08:00:00
644
3
原创 【c++】多态
多态是⼀个继承关系的下的类对象,去调⽤同⼀函数,产⽣了不同的⾏为。⽐如Student继承了Person。Person对象买票全价,Student对象优惠买票。
2025-10-25 08:00:00
925
原创 【c++】继承
下⾯我们看到Person是基类,也称作⽗类。Student是派⽣类,也称作⼦类。(因为翻译的原因,所以既叫基类/派⽣类,也叫⽗类/⼦类)
2025-10-22 08:00:00
1855
1
原创 【c++】模板
一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式。【优点】1.模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生2.增强了代码的灵活性【缺陷】1.模板会导致代码膨胀问题,也会导致编译时间变长2.出现模板编译错误时,错误信息非常凌乱,不易定位错误。
2025-10-21 08:00:00
953
原创 【c++】stack和queue
目录1. stack的介绍和使用 1.1stack的介绍1.2stack的使用1.3 例题最小栈1.4栈的模拟实现2.queue的介绍和使用2.1 queue的介绍2.2 queue的使用2.3 queue的模拟实现3.优先级队列priority_queue的介绍和使用3.1priority_queue介绍3.2priority_queue使用stack - C++ 参考 --- stack - C++ Reference使用代码:1.3 例题最小栈155. 最小栈 - 力扣(LeetCode)这
2025-10-20 08:00:00
1587
原创 【c++】模板初阶
class 类模板名// 类内成员定义// 类模版public:_size = 0;// 模版不建议声明和定义分离到两个文件.h 和.cpp会出现链接错误,具体原因后面会讲// 扩容++_size;
2025-10-04 15:41:05
568
原创 【C++】内存管理
int main()// new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间还会调用构造函数和析构函数free(p1);delete p2;// 内置类型是几乎是一样的// Cfree(p3);delete p4;free(p5);return 0;注意:在申请自定义类型的空间时,new会调用构造函数,
2025-09-24 18:29:16
927
原创 【C++】类和对象(下)
⽆论是否显⽰写初始化列表,每个构造函数都有初始化列表。⽆论是否在初始化列表显⽰初始化成员变量,每个成员变量都要⾛初始化列表初始化。class Datepublic:,_t(12),_ref(x),_n(1)// error C2512: “Time”: 没有合适的默认构造函数可⽤// error C2530 : “Date::_ref” : 必须初始化引⽤。
2025-09-20 08:00:00
776
原创 【C++】类和对象(中)
析构函数与构造函数功能相反,析构函数不是完成对对象本⾝的销毁,⽐如局部对象是存在栈帧的,函数结束栈帧销毁,他就释放了,不需要我们管,C++规定对象在销毁时会⾃动调⽤析构函数,完成对象中资源的清理释放⼯作。赋值运算符重载是⼀个默认成员函数,⽤于完成两个已经存在的对象直接的拷⻉赋值,这⾥要注意跟拷⻉构造区分,拷⻉构造⽤于⼀个对象拷⻉初始化给另⼀个要创建的对象。如果⼀个构造函数的第⼀个参数是⾃⾝类类型的引⽤,且任何额外的参数都有默认值,则此构造函数也叫做拷⻉构造函数,也就是说拷⻉构造是⼀个特殊的构造函数。
2025-09-17 07:30:00
1029
原创 【C++】类和对象(上)
class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后⾯分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的⽅法或者成员函数。为了区分成员变量,⼀般习惯上成员变量会加⼀个特殊标识,如成员变量前⾯或者后⾯加_ 或者 m开头,注意C++中这个并不是强制的。C++中struct也可以定义类,C++兼容C中struct的⽤法,同时struct升级成了类,明显的变化是struct中可以定义函数,⼀般情况下我们还是推荐⽤class定义类。
2025-09-13 14:57:20
1136
1
原创 初识C++:推开C++大门
定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量,所以下 ⾯的rand不在冲突了。C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。局部域和全局域除了会影响。
2025-09-12 08:00:00
626
原创 【数据结构】计数排序和归并排序
归并排序(MERGE-SORT)是建⽴在归并操作上的⼀种有效的排序算法,该算法是采⽤分治法(Divide and Conquer)的⼀个⾮常典型的应⽤。将已有序的⼦序列合并,得到完全有序的序列;本质是用数组自然序号(下标)排序,统计每个数据出现的次数:count[a[i]]++。找到对应值之后就对该位置进行自增,来表示该数据出现的次数。之后再根据出现的次数,将该数据覆盖原有的数组相应位置的值。计数排序⼜称为鸽巢原理,是对哈希直接定址法的变形应⽤。计数排序在数据范围集中时,效率很⾼,但是适⽤范围及场景有限。
2025-09-06 08:00:00
586
原创 【数据结构】冒泡排序和快速排序
这两个排序都是交换排序,它的基本思想为:所谓交换,就是根据序列中两个记录键值的⽐较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较⼤的记录向序列的尾部移动,键值较⼩的记录向序列的前部移动。
2025-09-03 08:00:00
903
原创 【数据结构】选择排序和堆排序
每⼀次从待排序的数据元素中选出最⼩和最⼤的两个个元素,最小的存放在序列的起始位置,最大的存放在末尾位置,直到全部待排序的数据元素排完。这里创建begin,和end来记录每一轮数组的范围,在创建min和max表示下标,再进入循环寻找最大和最小的数,最后在交换数据。每⼀次从待排序的数据元素中选出最⼩(或最⼤)的⼀个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。首先我们看外层循环,最欢情况下是N/2,内层循环最坏情况下也是N/2,综上时间复杂度为O(N^2)。由于之前写过,可以参考之前的文章。
2025-09-01 08:00:00
268
原创 【数据结构】TOP-K问题
TOP-K问题:即求数据结合中前K个最⼤的元素或者最⼩的元素,⼀般情况下数据量都⽐较⼤。⽐如:专业前10名、世界500强、富豪榜、游戏中前100的活跃玩家等。对于Top-K问题,能想到的最简单直接的⽅式就是排序,但是:如果数据量⾮常⼤,排序就不太可取了 (可能数据都不能⼀下⼦全部加载到内存中)。最佳的⽅式就是⽤堆来解决,基本思路如下:1:⽤数据集合中前K个元素来建堆前k个最⼤的元素,则建⼩堆前k个最⼩的元素,则建⼤堆2:⽤剩余的N-K个元素依次与堆顶元素来⽐较,不满⾜则替换堆顶元素。
2025-08-30 11:56:09
874
原创 【数据结构】堆排序
首先我们创建一个end表示数组最后一个数据下标,然后使用Swap交换首位两个数据,交换完之后使用向下调整法,选出次小的数放在首位;在排序前我们需要建立一个堆,如果我们需要降序排序的话,一般推荐建小堆,大堆很麻烦。我们可以看到HeapSort里面的主要有向上和向下调整法两个(不知道怎么算的可以看。这篇),所以时间复杂度为O(N+N*logN),即O(N*logN)。若是想要排升序列表则只需将if里面改为大于号就行。就可以得到一个降序排列。建完堆之后就可以进行排序了。
2025-08-26 12:35:14
294
原创 【数据结构】堆的前中后序遍历
一 .遍历规则按照规则,⼆叉树的遍历有:前序/中序/后序的递归结构遍历:1. 前序遍历(Preorder Traversal 亦称先序遍历):访问根结点的操作发⽣在遍历其左右⼦树之前访问顺序为:根结点、左⼦树、右⼦树2. 中序遍历(Inorder Traversal):访问根结点的操作发⽣在遍历其左右⼦树之中(间)访问顺序为:左⼦树、根结点、右⼦树3. 后序遍历(Postorder Traversal):访问根结点的操作发⽣在遍历其左右⼦树之后访问顺序为:左⼦树、右⼦树、根结点。
2025-08-22 08:00:00
503
原创 【数据结构】堆
堆的概念与结构如果有⼀个关键码的集合K= {k0k1k2, ...kn−1,把它的所有元素按完全⼆叉树的顺序存储⽅ 式存储,在⼀个⼀维数组中,并满⾜:k(i)<=K(2∗i+1)K(i)>=K(2∗i+1)且K(i)<=K(2∗i+2),i = 0、12...,则称为⼩堆(或⼤堆)。将根结点最⼤的堆叫做最⼤堆或⼤根堆,根结点最⼩的堆叫做最⼩堆或⼩根堆。堆具有以下性质:堆中某个结点的值总是不⼤于或不⼩于其⽗结点的值。
2025-08-16 08:00:00
1988
原创 【数据结构】二叉树
一. 树1.1 树的结构与概念树是⼀种⾮线性的数据结构,它是由nn>=0) 个有限结点组成⼀个具有层次关系的集合。把它叫做 树是因为它看起来像⼀棵倒挂的树,也就是说它是根朝上,⽽叶朝下的。有⼀个特殊的结点,称为根结点,根结点没有前驱结点。除根结点外,其余结点被分成M(M>0)个互不相交的集合T1T2……Tm,其中每⼀个集合 Ti(1 <= i <= m) ⼜是⼀棵结构与树类似的⼦树。每棵⼦树的根结点有且只有⼀个前驱,可以 有 0个或多个后继。因此,树是递归定义的。
2025-08-13 15:47:23
807
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅