- 博客(64)
- 收藏
- 关注
原创 特殊类设计
C++ 98:将 拷贝构造 和 赋值重载 只声明不定义且私有化。C++ 11:error C2280: “Copy_Ban::Copy_Ban(Copy_Ban &)”: 尝试引用已删除的函数核心步骤只有 3 条:创建对象:3. 请设计一个 只能在栈上创建对象 的类将构造私有化通过特定接口创建对象将 operator new (operator delete)封死创建对象:何时需要删除 ?你的类被设计成不可复制的(既不能被拷贝构造,也不能被赋值)。你的类包含了一些不允许复制的
2024-07-17 09:00:00
913
24
原创 lambda 表达式
传值捕捉时,mutable 可以取消参数的常性,使其在函数体内能被修改。不使用时,可以省略;,且 lambda表达式 的名称是编译器根据特定算法实时生成的、保证不重复。此处解释了,“为什么 lambda表达式 之间不能相互赋值”。:函数体的返回值类型,通常可以省略,由编译器自行推导。C++11 中,最简单的 lambda 表达式为。不需要传递参数时,可以连同。的方式不是类重载“函数调用运算符”吗?不可省略(即使参数列表为空)。通过以上场景,可以看出。,但它没有任何作用。
2024-06-20 09:30:00
419
20
原创 右值引用和移动语义
通俗来讲,可以出现在赋值语句左侧的,为左值;只能出现在赋值语句右侧的,为右值。左值能取地址,但右值不能。本文主要通过三个场景 —— 与移动构造、移动赋值、完美转发有关,讲解右值引用在实际场景中的作用及其相关的知识。右值通常也被形象的称为“将亡值”,代指赋值重载和拷贝构造过程中产生的临时对象。public:// 拷贝构造 -- 左值cout << "string(const string& s) -- 深拷贝" << endl;// 拷贝赋值。
2024-06-14 09:30:00
1138
19
原创 C++11 列表初始化(initializer_list),pair
的使用范围,使其可用于所有内置类型和自定义类型。是 C++11 引入的一个模板类型,用于处理一组。初始化或传递一系列相同类型的值。C++98 中,允许使用。
2024-06-09 08:30:00
524
17
原创 布隆过滤器
假设 “Tencent” 与 “Baidu” 映射到同一 pos2 ,删除 “Tencent” ,将无法再查询到 “Baidu”。Set("Tencent") ——> 经过一系列哈希函数的映射,对布隆过滤器底层数据结构上 pos1、pos2、... 等位置进行标记;所对应的 pos1、pos2、... ,那么即便没有插入 “Tencent” ,Test(Tencent)的结果仍然为。经这一系列哈希函数映射的、对应底层数据结构的位置,是否都被标记,得出结论。——> 换一个哈希函数,把该小文件。
2024-05-18 19:09:51
295
24
原创 位图和布隆过滤器:位图
在《和》 中提到过:哈希是一种思想,通过哈希函数将数据转化为一个或多个整型 —— 映射关系;通过这种映射关系,可以做到以 O(1) 的时间复杂度查找数据。本文即将介绍的和就是两个非常典型的哈希思想的应用成果,可以在的同时,。
2024-05-16 09:00:00
774
20
原创 unordered_map 和 unordered_set
unordered——,从表面上来看,与 map 和 set 不同之处就在于,unordered_map 和 unordered_set 无法保证插入数据是有序的;尽管如此,由于这两种容器内部封装了“哈希桶”,可以实现—— 这一优点与 map 和 set 相同。其实,在我们模拟过 map set 的基础上,再学习封装 无序map 和 无序set 实在简单。因此,。哈希哈希表 / 哈希桶。
2024-05-14 09:00:00
1127
17
原创 开散列哈希桶
通过 HashFunc 计算每个元素的哈希地址,哈希地址相同的元素所组成的子集称为 哈希桶,这些元素通过单链表链接在一起。。开散列的每个桶中存的都是发生哈希冲突的元素。
2024-05-13 08:45:00
393
10
原创 通过红黑树封装 map 和 set 容器
template // 与 list 迭代器处没有区别,Ref —— T& ,Ptr —— T*{}迭代器指向节点的右子树不为空时, operator++() 的下一个位置就是其右子树的最左节点。迭代器指向节点的右子树为空,意味当前节点所在的左子树已经全部访问完了,operator++() 的下一个位置是当前子树为左子树的最近祖宗节点。
2024-05-09 12:16:13
692
16
原创 红黑树(RBTree)认识总结
红黑树是一种二叉搜索树,与普通搜索树不同的是,在每个节点上增加一个“颜色”变量 —— RED / BLACK。通过对各个节点颜色的限制,确保从 根 到 NIL,没有一条路径会比其他路径长出两倍。
2024-05-07 08:30:00
639
18
原创 平衡二叉搜索树(AVL)旋转
单独开一章节介绍 RotateL 、 RotateR 及更复杂的 LR 和 RL 型旋转,更多是为了红黑树的旋转部分做铺垫;由于 AVL 树和红黑树发生旋转的判断标准不同 —— 分别为平衡因子和节点的颜色,两棵树左旋和右旋的在细节上会有一些差异,但从整体来看,二者的精神一致。关于如何快速记忆什么时候为左旋、右旋、或左右旋、或右左旋,有一个小技巧:当左树更高,需要向右调整高度,此时右旋;当右树更高,需要向左调整高度,此时左旋 … …
2024-05-06 08:00:00
566
8
原创 map::operator[] 底层大致介绍及与 map::insert() 区别
把该式的返回值结果记为 pair<Iterator_pair_val, bool>假设 map 中已经存在 pair<key1, value1>,需要对 insert 的返回值进行一系列操作,才能实现。调用 insert(pair<key1, value2>)为了方便后续讲解,把创建的。变量记为 pair_val。,因此在这种情况下,
2024-05-05 10:42:28
398
5
原创 模板进阶:非类型模板参数,特化
非类型模板参数,就是用一个常量作为 类/函数 的模板参数,在 类/函数 中可以被当成常量使用。一般情况函数模板无法实例化出满足要求的函数,我们通常给出具体实现——更简单、方便。首先给定一个 Date 类,并完善必要的函数及运算符重载,以便后续介绍相关概念。如果想要做到通过指针就能完成对日期大小的比较,则需要。全特化:将模板参数列表中所有参数都给明。下,Less(p1, p2) 是在。
2024-03-16 10:57:01
667
27
原创 C++ 反向迭代器的设计与实现
为了使我们的反向迭代器能快速用起来,优先实现 ++ , * , -> ,!= 等功能,其余以此类推。重载 ++--cur;--cur;return tmp;// 存在隐式类型转换 <--> ReverseIterator<Iterator>(tmp);“为什么前置++ 的返回值不能是 cur?error C2440: “return”: 无法从“Iterator”转换为“ReverseIterator<int *> &”重载 * :引入一个模版参数 Ref--tmp;
2024-02-29 13:10:45
657
15
原创 stack_queue:三个关键注意事项解析
使用过程中存在大量“头删”——pop_front(),用 vector 进行封装效率太低,故。就是一个仿函数——从根往叶子节点看,数值/优先级 越来越小,因此默认为大堆;的重载,故 priority_queue 不支持底层使用 list。时——_con[child] > _con[parent],要。—— 从根往叶子节点看,数值/优先级 越来大,则建小堆。为容器,在实例化创建对象时,我们可以传。,在插入和删除时,通常会涉及。实现,其实例化对象可以。queue 的原则是。
2024-02-03 08:00:00
448
18
原创 C++ STL中list迭代器的实现
list 的模拟实现中,重难点在于迭代器功能的实现,因此本文只围绕iterator及的设计进行介绍,其余如增删查改则不再赘述——在C语言的基础上,这些都非常简单。与 string / vector 不同,list 的节点原生指针不能通过简单的 ++ / * 等实现迭代器,因此我们需要节点指针封装自定义类型运算符重载,完成迭代器的设计。为了与 STL中list 进行区分,我们在创建的命名空间内实现。
2024-01-28 14:33:49
736
13
原创 解决 Linux git push 贡献者不同(没有出现绿点)的问题
【代码】解决 Linux git push 贡献者不同(没有出现绿点)的问题。
2023-12-22 08:00:00
1101
7
原创 【make/Makefile】Linux下进度条的设计与实现
Makefile 和 makefile 不区分大小写,但是一定只能是 “makefile”!!!make是一个指令,makefile是一个文件。使用 make 生成目标文件时,默认从上到下扫描 Makefile 文件,默认形成的是第一个目标文件——默认只生成一个。
2023-12-21 08:00:00
524
2
原创 MyString:string类的模拟实现
为了区分标准库中的string,避免编译冲突,使用命名空间 MyString。MyString。
2023-12-10 13:05:11
900
19
原创 string类:`reserve()`,`resize()`详解
PS:reserve(size_t n) 为string预留空间,不改变有效元素个数;当 reserve 的参数小于底层空间总大小时,reserve 不会改变容量大小。n > capacity ——> 扩容+尾插size < n < capacity ——> 尾插n < size ——> 删除数据,只保留前 n 个PS:resize() 在改变元素个数时,如果是将元素个数增加,可能会改变 capacity 的大小—— 、 这两种情况;如果是将元素个数减少,则不改变 capacity 的大小—— 的
2023-12-07 08:00:00
649
2
原创 C/C++内存管理(2):`new`和`delete`的实现原理
int _top;return 0;new:开对象空间+调用构造函数delete:调用析构函数+释放对象空间T为某一种类new T1.调用函数申请空间2.在已申请空间上调用构造函数,完成对象的构造。delete1.调用析构函数,完成对象资源清理2.调用释放空间。new T[N]1.调用2.在过程中,实际调用完成对N。
2023-11-24 08:00:00
255
2
原创 C/C++内存管理(1):C/C++内存分布,C++内存管理方式
int _val;:_val(x){}int main()// 与`malloc`相比,`new`可以对自定义类型进行初始化delete p1;delete p2;return 0;在申请和释放自定义类型的空间时,new会调用构造函数,delete会调用析构函数。
2023-11-22 08:00:00
636
2
原创 类和对象(7):初始化列表
以一个开始,用分隔的数据成员列表,每个“成员变量”后跟一个(),其中放初始值或表达式。// Date类,_day(day){}// Stack类public:,_top(0)private:int* _a;int _top;每个成员变量只能在初始化列表出现一次。只能初始化一次类中包含**引用成员变量const成员变量自定义类型成员(且该类没有默认构造函数时),必须在初始化列表进行初始化**。
2023-11-17 08:00:00
384
3
原创 类和对象(6):const成员,&/const &重载
用const修饰的成员函数,称为”const成员函数“。const修饰成员函数,实际上是修饰成员函数隐藏的this指针,表明在该成员函数中不能对类对象的任何成员进行修改。class Date。
2023-11-16 08:00:00
210
11
原创 类和对象(3):拷贝构造函数
运行结果:调用Func函数时创建临时Stack类对象st,其中st._a与st1._a指向了同一块空间,这块空间在程序运行过程中会被销毁两次。
2023-11-12 18:38:44
178
31
原创 类和对象(2):构造函数,析构函数
默认构造函数,指可以不传参就直接调用的构造函数。,使用编译器生成的默认析构,如:Date类;,在对象整个生命周期内只调用一次。(局部变量的销毁由编译器完成),构造函数是一种特殊的成员函数,,如:Stack类。
2023-11-11 21:35:49
162
20
原创 类和对象(1):类,对象,this指针
在C++中,更喜欢用关键字 class定义类。// 类体:由成员函数和成员变量组成 };声明和定义全部放在类体中。PS:成员函数如果在类中定义,编译器会把其当作内联函数(是否展开取决于编译器)。类声明放在.h文件中,成员函数定义放在.cpp文件中。
2023-10-27 08:30:00
189
26
原创 基本指令(2):通配符,重定向,命令行管道
是否有办法,在不创建“临时文件”的情况下,获取到目标的十行数据?,大部分硬件设备都可以看做有读写方法,只不过有些方法可以为空。如何获取其中第80000 ~ 80010行数据?向文件中写入数据时,默认会先清除文件内容。进行文件写入(文件不存在时会自动创建)。如果想要在文件内容末尾追加写入,则需要使用。假设在当前工作目录下,已创建。以上两条指令,都可以做到。,先对其进行文件写入。
2023-10-25 19:00:08
637
16
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人