大家应该已经看出来了,现在这个repo已经和数据结构没有什么必然的联系了。我们的目标是星辰大海stl。
一.容器
1.顺序容器
Vector Deque CircularQueue List ForwardList
Deque和CircularQueue都是双向队列的实现,其中Deque符合stl对deque的规范,"push_front, push_back, emplace_front and emplace_back do not invalidate any references to elements of the deque.",这是Vector/vector/CircularQueue都不具备的能力。
2.关联容器
这四种平衡树是Map的四种实现,默认的模板参数是RBTree
迭代器支持+-,利用的是平衡树本来就支持但是stl偏偏没有的kth和rankof
然而即使每个节点多维护了一个size信息还是轻松干掉开O2的stl
链表/开放寻址的散列表,根据SFINAE来自动选择使用哪一个。提供一个哈希函数的话就会选择链表,从Linear,Quadratic,Double三种探查方式里选一个的话就会用开放寻址。
如果跳表也算K-V容器的话.....
B树跑的是真的快。https://www.luogu.org/record/show?rid=6366862 平衡树模板题,我的B树是所有真的用了平衡树的提交里最快的,干掉红黑树不在话下。
3.堆
PriorityQueue LeftistTree PairingHeap FibHeap
后面三个都没有提供拷贝控制,懒得写
二.非容器数据结构 1.vEBTree
存放一定范围内的整数的数据结构。利用了一些模板的技巧摆脱了指针。
普通的树状数组和树状数组模拟的平衡树
3.KDTree
普通的KD树
4.PersistentArray PersistentTreap
普通的可持久化数组/可持久化Treap
5.BitSet
这个基本上是源码级复制stl的了...
三.算法
[Algorithm]https://github.com/MashPlant/DStl/blob/master/DataStructure/Algorithm.h
大概能看的就只有一个排序算法。原理是stl的魔改快排,快排+插排+堆排,基本可以稳定赢过stl一点。
[https://github.com/MashPlant/DStl/blob/master/DataStructure/TimSort.h]
一个TimSort的实现,又长又慢...
四.工具类
1.高精整数
十进制/二进制高精整数,后者的各种运算要快的多。
简化的智能指针实现,比shared_ptr小的多(当然能力也弱一些)。
五.C++黑科技
1.模板元编程
ListT 编译期链表
SetT 编译期可持久化Treap
准确输出类的名字,与之相比,typeid有可能丢失引用/const信息。这个用来调一些模板的bug很好用。
2.IterTool
for (auto i : slice(filter(vec,[](int x){return x % 2 == 0;}), 0, 10))
std::cout << i << ' ';
大概就是这种画风的吧。
六.失败的作品
跑的比装string的map还慢...
除了拖慢编译时间之外什么也做不了