![](https://img-blog.csdnimg.cn/6786e31af18d4c149a363c5dc6c2d487.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
C++
文章平均质量分 62
欢迎来到我们的C++学习专栏!在这个专栏中,我们将深入探讨C++的基本概念、语法、数据结构、算法以及面向对象编程等核心内容。我们的目标是帮助你建立起扎实的C++基础,掌握这门强大的编程语言,从而在软件开发领域取得更大的成就。
行十万里人生
“211”院校本科在读,专注于C/C++编程语言、Linux操作系统编程、网络协议编程和MySQL数据库管理等计算机科学与技术领域。
但行好事,莫问前程。
展开
-
lambda 表达式
传值捕捉时,mutable 可以取消参数的常性,使其在函数体内能被修改。不使用时,可以省略;,且 lambda表达式 的名称是编译器根据特定算法实时生成的、保证不重复。此处解释了,“为什么 lambda表达式 之间不能相互赋值”。:函数体的返回值类型,通常可以省略,由编译器自行推导。C++11 中,最简单的 lambda 表达式为。不需要传递参数时,可以连同。的方式不是类重载“函数调用运算符”吗?不可省略(即使参数列表为空)。通过以上场景,可以看出。,但它没有任何作用。原创 2024-06-20 09:30:00 · 398 阅读 · 20 评论 -
右值引用和移动语义
通俗来讲,可以出现在赋值语句左侧的,为左值;只能出现在赋值语句右侧的,为右值。左值能取地址,但右值不能。本文主要通过三个场景 —— 与移动构造、移动赋值、完美转发有关,讲解右值引用在实际场景中的作用及其相关的知识。右值通常也被形象的称为“将亡值”,代指赋值重载和拷贝构造过程中产生的临时对象。public:// 拷贝构造 -- 左值cout << "string(const string& s) -- 深拷贝" << endl;// 拷贝赋值。原创 2024-06-14 09:30:00 · 1124 阅读 · 19 评论 -
C++11 列表初始化(initializer_list),pair
的使用范围,使其可用于所有内置类型和自定义类型。是 C++11 引入的一个模板类型,用于处理一组。初始化或传递一系列相同类型的值。C++98 中,允许使用。原创 2024-06-09 08:30:00 · 499 阅读 · 17 评论 -
布隆过滤器
假设 “Tencent” 与 “Baidu” 映射到同一 pos2 ,删除 “Tencent” ,将无法再查询到 “Baidu”。Set("Tencent") ——> 经过一系列哈希函数的映射,对布隆过滤器底层数据结构上 pos1、pos2、... 等位置进行标记;所对应的 pos1、pos2、... ,那么即便没有插入 “Tencent” ,Test(Tencent)的结果仍然为。经这一系列哈希函数映射的、对应底层数据结构的位置,是否都被标记,得出结论。——> 换一个哈希函数,把该小文件。原创 2024-05-18 19:09:51 · 281 阅读 · 24 评论 -
位图和布隆过滤器:位图
在《和》 中提到过:哈希是一种思想,通过哈希函数将数据转化为一个或多个整型 —— 映射关系;通过这种映射关系,可以做到以 O(1) 的时间复杂度查找数据。本文即将介绍的和就是两个非常典型的哈希思想的应用成果,可以在的同时,。原创 2024-05-16 09:00:00 · 749 阅读 · 20 评论 -
unordered_map 和 unordered_set
unordered——,从表面上来看,与 map 和 set 不同之处就在于,unordered_map 和 unordered_set 无法保证插入数据是有序的;尽管如此,由于这两种容器内部封装了“哈希桶”,可以实现—— 这一优点与 map 和 set 相同。其实,在我们模拟过 map set 的基础上,再学习封装 无序map 和 无序set 实在简单。因此,。哈希哈希表 / 哈希桶。原创 2024-05-14 09:00:00 · 1092 阅读 · 17 评论 -
开散列哈希桶
通过 HashFunc 计算每个元素的哈希地址,哈希地址相同的元素所组成的子集称为 哈希桶,这些元素通过单链表链接在一起。。开散列的每个桶中存的都是发生哈希冲突的元素。原创 2024-05-13 08:45:00 · 379 阅读 · 10 评论 -
闭散列哈希表
哈希。原创 2024-05-11 09:00:00 · 955 阅读 · 14 评论 -
通过红黑树封装 map 和 set 容器
template // 与 list 迭代器处没有区别,Ref —— T& ,Ptr —— T*{}迭代器指向节点的右子树不为空时, operator++() 的下一个位置就是其右子树的最左节点。迭代器指向节点的右子树为空,意味当前节点所在的左子树已经全部访问完了,operator++() 的下一个位置是当前子树为左子树的最近祖宗节点。原创 2024-05-09 12:16:13 · 673 阅读 · 16 评论 -
红黑树(RBTree)认识总结
红黑树是一种二叉搜索树,与普通搜索树不同的是,在每个节点上增加一个“颜色”变量 —— RED / BLACK。通过对各个节点颜色的限制,确保从 根 到 NIL,没有一条路径会比其他路径长出两倍。原创 2024-05-07 08:30:00 · 624 阅读 · 18 评论 -
平衡二叉搜索树(AVL)旋转
单独开一章节介绍 RotateL 、 RotateR 及更复杂的 LR 和 RL 型旋转,更多是为了红黑树的旋转部分做铺垫;由于 AVL 树和红黑树发生旋转的判断标准不同 —— 分别为平衡因子和节点的颜色,两棵树左旋和右旋的在细节上会有一些差异,但从整体来看,二者的精神一致。关于如何快速记忆什么时候为左旋、右旋、或左右旋、或右左旋,有一个小技巧:当左树更高,需要向右调整高度,此时右旋;当右树更高,需要向左调整高度,此时左旋 … …原创 2024-05-06 08:00:00 · 555 阅读 · 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 · 380 阅读 · 5 评论 -
模板进阶:非类型模板参数,特化
非类型模板参数,就是用一个常量作为 类/函数 的模板参数,在 类/函数 中可以被当成常量使用。一般情况函数模板无法实例化出满足要求的函数,我们通常给出具体实现——更简单、方便。首先给定一个 Date 类,并完善必要的函数及运算符重载,以便后续介绍相关概念。如果想要做到通过指针就能完成对日期大小的比较,则需要。全特化:将模板参数列表中所有参数都给明。下,Less(p1, p2) 是在。原创 2024-03-16 10:57:01 · 654 阅读 · 27 评论 -
C++ 反向迭代器的设计与实现
为了使我们的反向迭代器能快速用起来,优先实现 ++ , * , -> ,!= 等功能,其余以此类推。重载 ++--cur;--cur;return tmp;// 存在隐式类型转换 <--> ReverseIterator<Iterator>(tmp);“为什么前置++ 的返回值不能是 cur?error C2440: “return”: 无法从“Iterator”转换为“ReverseIterator<int *> &”重载 * :引入一个模版参数 Ref--tmp;原创 2024-02-29 13:10:45 · 646 阅读 · 15 评论 -
stack_queue:三个关键注意事项解析
使用过程中存在大量“头删”——pop_front(),用 vector 进行封装效率太低,故。就是一个仿函数——从根往叶子节点看,数值/优先级 越来越小,因此默认为大堆;的重载,故 priority_queue 不支持底层使用 list。时——_con[child] > _con[parent],要。—— 从根往叶子节点看,数值/优先级 越来大,则建小堆。为容器,在实例化创建对象时,我们可以传。,在插入和删除时,通常会涉及。实现,其实例化对象可以。queue 的原则是。原创 2024-02-03 08:00:00 · 442 阅读 · 18 评论 -
C++ STL中list迭代器的实现
list 的模拟实现中,重难点在于迭代器功能的实现,因此本文只围绕iterator及的设计进行介绍,其余如增删查改则不再赘述——在C语言的基础上,这些都非常简单。与 string / vector 不同,list 的节点原生指针不能通过简单的 ++ / * 等实现迭代器,因此我们需要节点指针封装自定义类型运算符重载,完成迭代器的设计。为了与 STL中list 进行区分,我们在创建的命名空间内实现。原创 2024-01-28 14:33:49 · 697 阅读 · 13 评论 -
MyString:string类的模拟实现
为了区分标准库中的string,避免编译冲突,使用命名空间 MyString。MyString。原创 2023-12-10 13:05:11 · 889 阅读 · 19 评论 -
387.字符串中的第一个唯一字符 —> `size()`
【代码】387.字符串中的第一个唯一字符 —> `size()`原创 2023-12-09 08:00:00 · 212 阅读 · 3 评论 -
string类重要接口(2):`+=`
string 类有两个尾插接口。则很好地弥补了,使用更加简便。原创 2023-12-08 08:00:00 · 242 阅读 · 2 评论 -
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 · 557 阅读 · 2 评论 -
模板初阶(2):函数模板的匹配原则,类模板的实例化
一个非模板函数可以和同名的函数模板同时存在。原创 2023-12-03 08:00:00 · 494 阅读 · 3 评论 -
迭代器 iterator
iterator。原创 2023-12-02 08:00:00 · 184 阅读 · 3 评论 -
模板初阶(1):函数模板,类模板
用不同类型的参数使用函数模板时,称为函数模板的实例化。原创 2023-11-25 08:00:00 · 454 阅读 · 11 评论 -
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 · 250 阅读 · 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 · 632 阅读 · 2 评论 -
拷贝对象时编译器的一些优化
在传参和传值返回的过程中,编译器会通过一些优化减少拷贝的次数。原创 2023-11-20 08:00:00 · 172 阅读 · 7 评论 -
类和对象(8):explicit,static成员,友元,内部类
的函数,原创 2023-11-19 17:40:38 · 213 阅读 · 32 评论 -
类和对象(7):初始化列表
以一个开始,用分隔的数据成员列表,每个“成员变量”后跟一个(),其中放初始值或表达式。// Date类,_day(day){}// Stack类public:,_top(0)private:int* _a;int _top;每个成员变量只能在初始化列表出现一次。只能初始化一次类中包含**引用成员变量const成员变量自定义类型成员(且该类没有默认构造函数时),必须在初始化列表进行初始化**。原创 2023-11-17 08:00:00 · 376 阅读 · 3 评论 -
类和对象(6):const成员,&/const &重载
用const修饰的成员函数,称为”const成员函数“。const修饰成员函数,实际上是修饰成员函数隐藏的this指针,表明在该成员函数中不能对类对象的任何成员进行修改。class Date。原创 2023-11-16 08:00:00 · 205 阅读 · 11 评论 -
类和对象(5):Date类详解
(暂不考虑 x < 0 的情况)等运算符,皆可都通过对。此处有一种重点,以**原创 2023-11-15 08:00:00 · 443 阅读 · 28 评论 -
类和对象(4):运算符重载 1
重点为运算符重载中关键的细节。原创 2023-11-14 08:00:00 · 321 阅读 · 20 评论 -
类和对象(3):拷贝构造函数
运行结果:调用Func函数时创建临时Stack类对象st,其中st._a与st1._a指向了同一块空间,这块空间在程序运行过程中会被销毁两次。原创 2023-11-12 18:38:44 · 171 阅读 · 31 评论 -
类和对象(2):构造函数,析构函数
默认构造函数,指可以不传参就直接调用的构造函数。,使用编译器生成的默认析构,如:Date类;,在对象整个生命周期内只调用一次。(局部变量的销毁由编译器完成),构造函数是一种特殊的成员函数,,如:Stack类。原创 2023-11-11 21:35:49 · 156 阅读 · 20 评论 -
类和对象(1):类,对象,this指针
在C++中,更喜欢用关键字 class定义类。// 类体:由成员函数和成员变量组成 };声明和定义全部放在类体中。PS:成员函数如果在类中定义,编译器会把其当作内联函数(是否展开取决于编译器)。类声明放在.h文件中,成员函数定义放在.cpp文件中。原创 2023-10-27 08:30:00 · 184 阅读 · 26 评论 -
C++入门(4):auto,范围for,nullptr
所占字节数相同,后续表示指针空值时最好使用 nullptr。来指示编译器,auto 声明的变量必须由编译器在。表示指针空值,使用时不需要包含头文件。与普通for循环相同,可以使用。auto 作为一个新的。原创 2023-10-25 08:00:00 · 412 阅读 · 13 评论 -
C++入门(3):引用,内联函数
以值作为参数或返回值类型,在传参和返回期间,函数不会传递实参或将变量本身直接返回,而是传递实参或返回变量的一份临时拷贝。因此用值作为参数或返回值类型,效率非常低下。编译时,C++编译器会在把内联函数在调用位置展开,没有建立函数栈帧的开销,在一定程度上提高程序运行效率。(在debug模式下,编译器默认不会对代码进行优化,需要通过设置以观察到内联函数)概念上,引用是被引用实体变量的别名,并没有开辟新的内存空间。引用是按照指针的方式实现的。修饰的函数,可以代替宏函数(引用一旦引用一个实体,就。原创 2023-10-24 13:04:36 · 757 阅读 · 12 评论 -
C++入门(2):缺省参数,函数重载,引用
Linux下函数名修饰规则:_Z + 函数名字符个数 + 函数名 + 参数类型首字母。C语言链接函数地址时,利用函数名找。(C语言中不存在同名函数),这些同名函数的参数不相同(类型,个数,类型顺序)。引用不是定义一个新的变量,而是给已有变量取一个。,它和它引用的变量共用同一块内存空间。函数重载:C++中允许出现。原创 2023-10-18 22:50:21 · 174 阅读 · 12 评论 -
C++入门(1):命名空间,IO流 输入输出,缺省参数
关键字:namespace// 命名空间内可以定义变量/函数/类型int a = 10;int* a;int top;// ...// ...命名空间可以嵌套.在同一工程中,编译器会把相同名称的命名空间合并成到同一个命名空间中。原创 2023-10-15 17:04:54 · 614 阅读 · 8 评论