C++ 实现的完整、通用的基础数据结构模板库
- 名称:HelloDS,意为 Hello Data Structure
- 语言:C++,满足 C++23 标准
- 目标:实现完整、通用的基础数据结构模板库;不使用任何标准库容器;支持迭代器
- 模块:List, Stack, Queue, Deque, Heap, Tree, Graph, Set, Map
- 简洁:Stay simple, stay young. 在保证健壮的前提下,尽量简洁,便于维护和阅读
- 健壮:安全的扩容机制,防止溢出。对容器的增删改查都有相应的检查
- 风格:大部分遵循 Google C++ Style Guide ,小部分基于项目规模和源码简洁性的考虑采用自己的风格
- 测试:使用 Catch2 进行了测试,确保测试全部通过
- 安全:使用 Dr. Memory 进行了检查,确保没有安全问题
- 文档:使用 Doxygen 生成文档
- 构建:使用 XMake 进行构建
可以看 examples 。
运行示例和测试:
xmake build && xmake run
其实最大的用处就是通过源码来学习/收藏/展示数据结构。
都是基础数据结构,没什么太大的亮点,中规中矩,因为这个项目的目的不是提供可使用的库,而是学习/收藏/展示数据结构。
如果你想要实用的容器库/类型库,可以看看我的另一个项目:PyInCpp。
这个项目始于 2019 年,当时自学数据结构边学边写的,用的 C 语言,当做练手项目。起源详情请见: https://zhuanlan.zhihu.com/p/92786307 。因为本科专业并不是计算机,所以当时没有学软件工程,写出来的代码只是能用,但是非常不优雅。后来接触到了面向对象思想和软件工程实践,我把整个项目推翻重写了好几次。
最开始那几年我根本没有把这个项目开源的想法,因为我觉得这只是我的一个个人练手作品,网上一搜一大把,没什么开源价值。但是后来陆陆续续把它功能写得很完善的时候,我发现其中有些功能的实现互联网上基本搜不到,比如字符串转数字(类似标准库的 atof ,但是这个库不依赖 string.h ,没错我是重新造轮子),我能找到的都不能与标准库相媲美,各种瑕疵(不能处理类似 ".123e-2" 这种情况,或者不能识别 nan 以及 inf ),而有些又太冗杂(各种 if else 嵌套),我想了两天最后用 FPGA 里面的独热码思想结合有限状态机实现了(后来把 String
合并到 PyInCpp
里去了,因为 String
严格来说不算数据结构而算数据类型)。类似的还有许多,都是我在日积月累的学习中一行一行写出来的。有时候是灵光乍现(比如String_ToDecimal, String_ToInteger
的独热码结合有限状态机),有时候是从其他语言的标准库中得到的启发(比如String_From
的命名仿照 Rust 标准库中 String 的 from 方法),有时候是网友给的建议(比如DoublyLinkedList_At
的内部状态指针加速访问)。
因为二叉树的中序遍历需要用到队列,而 C 语言无法简洁地实现泛型,所以之前一直是把队列函数源码复制一份当成static
的然后 typedef const struct BinarySearchTreeNode* ArrayQueueItem;
手动模拟泛型,但这样太不优雅了,2024 年用 C++ 重写了!原先的 C 语言版本保留在 branch v1 中。