C++
文章平均质量分 95
C++相关博客
Tanecious.
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
C++11
C++11 引入了重要的新特性,包括统一的列表初始化和 initializer_list 容器。列表初始化允许使用 {} 对任意对象进行初始化,支持内置类型和自定义类型,编译器会自动优化构造过程。initializer_list 类封装了常量区数据,使 STL 容器能够通过列表初始化构造对象。这些改进使 C++ 更加现代化,简化了容器的初始化操作,提升了代码简洁性和性能。C++11 作为重大更新版本,为后续 C++14/17/20 的发展奠定了基础。原创 2025-07-20 22:09:40 · 956 阅读 · 0 评论 -
C++--哈希表封装实现 unordered_map 和 unordered_set
本文介绍了哈希表封装实现 unordered_map 和 unordered_set 的方法。主要内容包括: 分析了SGI-STL30版本中哈希表的实现框架,hash_map和hash_set通过复用同一个hashtable实现key和key/value结构。 模拟实现了unordered_map和unordered_set的底层哈希表框架: 使用模板参数T控制哈希节点数据类型 通过仿函数MapKeyOfT/SetKeyOfT获取键值 解决string类型取模问题,特化HashFunc仿函数 关键点: 哈希原创 2025-07-16 12:02:12 · 1130 阅读 · 0 评论 -
C++--哈希
哈希是一种通过哈希函数建立关键字与存储位置映射关系的数据组织方式,可实现快速查找。关键概念包括负载因子(衡量空间利用率与冲突概率)、哈希函数设计原则(如直接定址法、除留余数法等)以及哈希冲突解决方法(闭散列的线性/二次探测和开散列的链地址法)。闭散列通过探测空位解决冲突,而开散列通过链表链接冲突元素。文中还探讨了不同哈希函数的适用场景及其优缺点,强调设计高效哈希函数以减少冲突的重要性。原创 2025-07-15 19:15:35 · 367 阅读 · 0 评论 -
C++--unordered_set和unordered_map的使用
Key 就是 unordered_set 底层关键字的类型。unordered_set 默认要求 Key 支持转换为整形,如果不支持或者想按自己的需求实现可以将 Key 转成整形的哈希函数传给第二个模板参数。unordered_set 默认要求 Key 支持比较相等,如果不支持或者想按自己的需求实现可以将 Key 比较相等的函数传给第三个模板参数。unordered_set 底层存储数据的内存是从空间配置器申请的,如果需要可以自己实现内存池,传给第四个参数。原创 2025-07-13 22:57:09 · 845 阅读 · 0 评论 -
C++--红黑树封装实现set和map
为了让 end() 能够指向最右节点的下一个节点, stl 源码中增加了一个哨兵位的头结点,该节点的 left 指向这棵树的最左节点,也就是 begin(),right 指向这棵树的最右节点,parent 指向 nullptr,然后让根的父节点指向它,最右节点的 right 也指向它,所以在 stl 源码的实现中这个哨兵位头结点就是 end()。如图:it指向11,11右为空,11是8的右,11所在子树访问完了,8所在子树也访问完了,继续往上找,8是13的左,那么下一个访问的结点就是13。原创 2025-07-13 20:41:23 · 798 阅读 · 0 评论 -
C++--红黑树
红黑树是一种平衡二叉搜索树,但和 AVL 树使用高度来控制平衡不同,红黑树在每个结点上增加一个存储位来表示结点的颜色,可以是Red或Black,然后通过对任何一条从根到叶子的路径上各个结点着色方式的限制来达到接近平衡。红黑树通过对每个节点颜色的限制,从而使得整棵树的最长路径不超过最短路径的两倍 (注意是整棵树,对子树没有要求),这样红黑树就可以达到接近平衡。注意:因为红黑树只要求整棵树中最长路径是最短路径的两倍,所以红黑树是近似平衡的,即子树中某一路径可能比另一条路径长两倍不止;原创 2025-07-11 15:39:08 · 1555 阅读 · 0 评论 -
C++--异常
实际上很多公司都会自定义自己的异常体系统进行异常管理。公司中的项目一般会进行模块划分,让不同的程序模块或小程序完成不同的模块,如果不对抛出异常事件进行规划,那么负责模块层抛出异常的程序员将无法知道因为需要抛出各类型的异常。因此实际公司定义了一套集中的规范体系,首先定义一个最基础的异常类,所有人抛出的异常都必须继承该类异常的最低类型,因为异常处理可以仅基类异常抛出的最低类型异常,因此最基础类的异常类型就抛出了。原创 2025-07-10 19:05:18 · 693 阅读 · 0 评论 -
C++--AVL树
在前面学习二叉搜索树时提到,二叉搜索树的查找效率为 O(N),因为当数据有序或接近有序时,构建出来的二叉搜索树是单分支或接近单分支的结构,此时树的高度接近 n,所以最坏情况下二叉搜索树的查找效率为 O(N)。为了应对上面这种情况,两位俄罗斯的数学家 G.M.Adelson-Velskii 和 E.M.Landis 在1962年提出了一种解决办法,当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1 (需要对树中的结点进行调整来实现),即可降低树的高度,从而减少平均搜索长度。原创 2025-07-08 17:18:15 · 1211 阅读 · 0 评论 -
C++--map和set的使用
set 是按照一定次序存储元素的容器,其底层是一棵平衡二叉搜索树 (红黑树),由于二叉搜索树的每个节点的值满足左孩子 < 根 < 右孩子,并且二叉搜索树中没有重复的节点,所以 set 可以用来排序、去重和查找,同时由于这是一棵平衡树,所以 set 查找的时间复杂度为 O(logN),效率非常高。同时,set 是一种 key 模型 的容器,也就是说,set 中只有键值 key,而没有对应的 value,并且每个 key 都是唯一的。原创 2025-07-07 20:09:53 · 1251 阅读 · 0 评论 -
C++--二叉搜索树
给一个单词word,判断该单词是否拼写正确,可以将 K 的类型定义为 string,然后将英语词库中的所有单词作为 key,构建一颗二叉搜索树,然后在二叉搜索树中对用户写出的每一个单词进行查找,如果找不到,则说明该单词拼写错误。那么这样的效率显然是无法满足需求的,后面需要继续了解二叉搜索树的变形,平衡二叉搜索树AVL树和红黑树,才会适用在内存中存储和搜索数据。,通过英文可以快速找到与其对应的中文,英文单词与其对应的中文 <word, chinese> 就构成一种键值对;原创 2025-07-06 09:05:44 · 1189 阅读 · 0 评论 -
C++--多态
下面所提及的多态都是运行时多态(动态多态)。以下程序输出结果是什么( )A: A->0 B: B->1 C: A->1 D: B->0 E: 编译出错 F: 以上都不准确class Apublic:public:p->test();return 0;在主函数中首先观察到**创建了一个子类指针p用来指向一个子类对象B**,然后通过p调用父类的test()函数。这里可以看到test函数中调用了func函数,但是这里是由this去调用的func。原创 2025-07-04 23:47:27 · 1228 阅读 · 0 评论 -
C++--继承
继承(inheritance)机制是面向对象程序设计使代码可以复用的重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称为派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前接触的复用都是函数复用,而继承便是类设计层次的复用。下面在没有学习到继承之前设计了两个类Student和TeacherStudent和Teacher都有姓名、年龄等成员变量,都有Print这个成员函数,然而这些内容在这两个类中是重复出现的,设计到两个类里面就是冗余的。原创 2025-07-01 13:43:39 · 825 阅读 · 0 评论 -
C++--模版进阶
本文介绍了C++模板的进阶应用,主要包括非类型模板参数、模板特化和分离编译。非类型模板参数允许使用常量作为模板参数,类似宏定义但更灵活。模板特化分为函数模板特化和类模板特化,其中类模板特化又分为全特化和偏特化,用于处理特殊类型的情况。分离编译模式下,模板的声明和定义通常需要放在同一文件中以避免链接错误。文章通过示例代码展示了这些概念的具体应用,帮助读者更好地理解和使用C++模板的高级特性。原创 2025-06-11 00:22:45 · 1044 阅读 · 0 评论 -
C++--stack和queue的使用及其模拟实现
设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。Java 语言非常关注设计模式,而 C++ 并没有太关注,但是一些常见的设计模式还是要学习。迭代器模式其实在前面学习stringvector和list时就已经接触过设计模式了。迭代器就是一种设计模式。迭代器模式是封装后提供统一的接口iterator在不暴露底层实现细节的情况下,使得上层能够以相同的方式来访问不同的容器。适配器模式适配器模式则是将一个类的接口转换成客户希望的另外一个接口,即根据已有的东西转换出想要的东西。原创 2025-06-09 20:59:57 · 957 阅读 · 0 评论 -
C++--list的使用及其模拟实现
可以看到,list sort 的效率远低于 vector sort,甚至于说,直接使用 list sort 的效率都不如先将数据拷贝到 vector 中,然后使用 vector sort,排序之后再将数据拷贝回 list 中快。至此也能明白为什么 list sort 接口使用的非常少了。**注意:**在 release 版本下测试软件或算法性能得到的结果要比在 debug 版本下得到的结果具有参考意义。原创 2025-06-07 21:16:40 · 903 阅读 · 0 评论 -
C++--vector的使用及其模拟实现
迭代器失效一定会导致错误,所以在平时使用迭代器的时候为了保证程序的跨平台性,统一认为迭代器失效之后,必须更新后才能再次使用。原创 2025-06-04 22:24:36 · 875 阅读 · 0 评论 -
C++--string的使用及其模拟实现
C++中的string类简介 C++标准库提供的string类解决了C语言字符串操作中的诸多问题,如内存管理、边界检查等,并遵循面向对象思想。string本质上是一个模板类basic_string<char>,支持多种编码方式。 VS和g++编译器对string的实现不同:VS采用固定16字节小缓冲区优化,以空间换时间;g++则使用写时拷贝技术提高效率。string类提供了丰富的接口,包括构造函数、迭代器、运算符重载等。 C++11引入的auto关键字和范围for循环简化了string的遍历操作原创 2025-05-30 11:06:21 · 1114 阅读 · 0 评论 -
C++--STL简介
STL(标准模板库)是C++标准库的核心部分,提供了一系列可复用的数据结构和算法框架。STL起源于惠普实验室的原始版本,随后衍生出多个版本,如P.J.版本、RW版本和SGI版本,其中SGI版本因其可移植性和高可读性被广泛采用。STL包含六大组件,极大地简化了C++编程,避免了重复造轮子,提升了开发效率。由于其重要性,STL在C++学习、面试和实际工作中都是重点考察内容,掌握STL是C++程序员的基本要求。原创 2025-05-20 23:18:01 · 327 阅读 · 0 评论 -
C++--模版初阶
在C++中,存在这样一个模具,通过给这个模具中填充不同材料(类型),来获得不同材料的铸件(即生成具体类型的代码)。泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。函数模版类模版。原创 2025-05-20 23:16:53 · 1455 阅读 · 0 评论 -
C++--内存管理
C++动态内存管理和C语言动态内存管理最大的不同在于二者对自定义类型的处理:C语言 malloc/calloc/realloc 函数只负责开辟空间,free 函数只负责销毁空间。而C++在申请自定义类型的空间时,new 会调用构造函数,delete 会调用析构函数,完成对应对象的初始化和销毁。class Apublic://构造函数: _a(a)cout << "A 构造" << this << endl;//析构函数~A()cout << "A 析构" << this << endl;原创 2025-05-19 23:16:32 · 823 阅读 · 0 评论 -
C++--类和对象
class 为定义类的关键字,className为类的名字(由程序员自行决定)同样也是类的类型,{} 中为类的主体,注意类定义结束时后面分号不能省略。类体中的成员称为类的成员:类中的变量称为属性或成员变量;类中的函数称为方法或成员函数。//类体:由成员变量和成员函数组成 };//注意后面的分号为了区分成员变量,一般习惯上成员变量会加一个特殊标识,如成员变量前面或后面加 m 开头,注意 C++ 中这个并不是强制的,只是一些惯例,要看具体的要求。原创 2025-05-18 15:01:30 · 639 阅读 · 0 评论 -
C++--入门基础
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间内的变量/函数/类等。命名空间中可以定义变量/函数/类等。namespace只能定义在全局,当然还可以嵌套定义。namespace后面的空间名不受限制,可以随机取,一般取项目名称作为空间名。//定义命名空间//定义变量//定义函数//定义类型(结构体)int data;}SLNode;//定义命名空间namespace N1//定义一个名为N1的命名空间//定义变量。原创 2025-05-02 22:58:09 · 2703 阅读 · 0 评论
分享