- 博客(40)
- 收藏
- 关注
原创 Linux环境变量
1.显示某个环境变量的值echo $变量名 :显示某个环境变量的值。2.设置一个环境变量,只在当前shell有效export 变量名=值 :设置环境变量。3.envenv:显示所有的环境变量4.unsetunset 变量名:删除某个环境变量或本地变量。5.setset :显示本地变量和环境变量。通过系统调用设置环境变量或获取环境变量// 获取环境变量值if (path!= NULL) {// 获取所有环境变量。
2025-12-04 16:10:09
859
原创 Linux进程详解
是操作系统分配资源(如 CPU 时间、内存、文件句柄等)并执行的一个程序实例。一个程序可以启动多个进程,每个进程相互独立,拥有自己的地址空间和运行状态。那我们该去如何理解呢?要想理解进程就先要理解计算机的体系结构和什么是操作系统。
2025-11-23 17:46:26
665
原创 C++智能指针
智能指针是一种封装了原始指针的类模板,它能够自动管理动态分配的内存,避免内存泄漏。1. RAII特性RAII()是一种利用对象生命周期来控制程序资源的简单技术。在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持有效,最后在对象析构的时候释放资源。借此,我们实际上把管理一份资源的责任托管给了一个对象。这种做法有两大好处:不需要显式地释放资源。采用这种方式,对象所需的资源在其生命期内始终保持有效。2.重载operator*和opertaor->
2025-10-18 18:00:39
961
原创 哈希扩展和应用
注意:第一,上面的哈希切分并不是严格的等分,而是近似的分,哈希切分是有分割不均的,因为会有哈希冲突,所以要切割的分数稍微多些,减少哈希冲突。set是明显不可以的,我们可以简单算一下40亿个不重复的无符号整数所占内存空间的大小,一个无符号整数按4字节,40亿就是160亿字节,1G约等于10亿字节,那么也就是差不多16G的内存,用set是需要在内存中开空间的,你能开16G大的空间吗,显然是不可能的。那么就要介绍位图的概念了。布隆过滤器的思想是将一个元素用多个哈希函数映射到一个位图中,因此被映射到的位置的比特。
2025-10-08 17:07:35
777
原创 C++用哈希表封装unordered_set和unordered_map
unorder_set和unordered_map的底层存储的都是一个哈希表,他们的插入、删除和查找本质上都是哈希表的插入、删除和查找。那么如何封unorder_set和unordered_map使他们复用哈希表呢?这就和封装map和set复用红黑树的原理基本一样。
2025-10-05 14:56:38
346
原创 哈希表原理详解
顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素时,必须要经过关键码的多次比较。顺序查找时间复杂度为O(N),平衡树中为树的高度,即,搜索的效率取决于搜索过程中元素的比较次数。。该方式即为哈希方法,当向该结构中:根据待插入元素的关键码,以此函数计算出该元素的存储位置并按此位置进行存放。对元素的关键码进行同样的计算,把求得的函数值当做元素的存储位置,在结构中按此位置取元素比较,若关键码相等,则搜索成功。
2025-09-30 16:37:38
602
原创 C++红黑树封装set和map代码详解
我们都知道set和map的底层都是通过红黑树来实现的,前面讲解了红黑树的原理和代码,那么如何通过红黑树的代码封装实现set和map呢。
2025-09-26 16:14:28
690
原创 C++红黑树详解
1.首先我们要确保插入的节点的颜色是红色的。这是因为如果插入的节点是黑色的会影响所有的路径,因为要保证每条路径上黑色节点的数目是一样的,插入的是红节点则只用看该路径是否满足红黑树的要求。一条最短的路径就是只有黑节点的路径。(红黑树是接近平衡的,AVL树是绝对平衡,但两者的性能相近,AVL树的旋转比较多且复杂 ,红黑树相对简单)2.如果要插入的父亲节点存在且颜色是黑色的,则无需进行调整,因为满足红黑树的性质。这里的a,b,c,d,e是可以变化的对应着各种复杂的情况。1. 按照二叉搜索的树规则插入新节点。
2025-09-21 21:43:36
297
原创 C++AVL树详解
二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。因此,两位俄罗斯的数学家和E.M.Landis在1962年发明了一种解决上述问题的方法:当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整,即可降低树的高度,从而减少平均搜索长度。一棵AVL。例:2.AVL树的插入AVL树就是在二叉搜索树的基础上引入了平衡因子,因此AVL。
2025-09-21 15:11:41
788
原创 C++多态详解
在继承中要构成多态还有两个条件1.必须通过基类的指针或者引用调用虚函数(虚函数:即被virtual修饰的类成员函数称为虚函数)。2.被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。
2025-09-11 14:24:52
612
原创 C++中的继承
1. 很多人说C++语法复杂,其实多继承就是一个体现。有了多继承,就存在菱形继承,有了菱形继承就有菱形虚拟继承,底层实现就很复杂。所以一般不建议设计出多继承,一定不要设计出菱形继承。否则在复杂度及性能上都有问题。2.多继承可以认为是C++的缺陷之一,很多后来的OO语言都没有多继承,如Java。3. 继承和组合public继承是一种is-a的关系。也就是说每个派生类对象都是一个基类对象。组合是一种has-a的关系。假设B组合了A,每个B对象中都有一个A对象。
2025-09-05 20:50:16
956
原创 stack和queue的模拟实现
#pragma once#include<deque>#include<vector>#include<list>namespace my{ //template<class T,class Contain = std::vector<T>> //template<class T, class Contain = std::list<T>> template<class T, class Contain = std::deque<T>> class stack
2025-08-27 22:43:40
660
原创 vector的模拟实现
/vector erase和insert迭代器对象后,不能再访问这个迭代器,认为迭代器失效,访问结果是未定义的,通过返回值解决//erase返回被删元素的下一个有效迭代器//insert返回指向新插入元素的迭代器public://构造函数vector(){}//根据迭代器区间初始化= last)++first;//拷贝构造//这里也是深拷贝问题i++)
2025-08-26 10:40:05
1029
原创 C++ string类
3. resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不同的是当字符个数增多时:resize(n)用0来填充多出的元素空间,resize(size_t n, char c)用字符c来填充多出的元素空间。注意:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大。还有insert(插入),erase(删除),assign(赋值,会覆盖原有的字符串),replace(替换)等函数,用的时候可以查文档进行使用。
2025-04-15 21:55:06
704
原创 C/C++内存管理
和new/delete的区别malloc/free和new/delete的共同点是:都是从堆上申请空间,并且需要用户手动释放。不同的地方是:1. malloc和free是函数,new和delete是操作符。2. malloc申请的空间不会初始化,new可以初始化。3. malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可, 如果是多个对象,[]中指定对象个数即可。
2025-04-01 20:04:32
1201
原创 C++类和对象(中)
构造函数,析构函数,拷贝构造,运算符重载,赋值重载,前置++和后置++重载,const成员,以及取地址及const取地址操作符重载。
2025-03-24 20:56:29
2230
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅
1