nukeexplode / DStl

蒟蒻实现的一些数据结构,大体上模仿stl

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

大家应该已经看出来了,现在这个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 AVL Treap Splay

这四种平衡树是Map的四种实现,默认的模板参数是RBTree

迭代器支持+-,利用的是平衡树本来就支持但是stl偏偏没有的kth和rankof

然而即使每个节点多维护了一个size信息还是轻松干掉开O2的stl

HashMap HashMap-OpenAddress

链表/开放寻址的散列表,根据SFINAE来自动选择使用哪一个。提供一个哈希函数的话就会选择链表,从Linear,Quadratic,Double三种探查方式里选一个的话就会用开放寻址。

SkipList

如果跳表也算K-V容器的话.....

BTree

B树跑的是真的快。https://www.luogu.org/record/show?rid=6366862 平衡树模板题,我的B树是所有真的用了平衡树的提交里最快的,干掉红黑树不在话下。

3.堆

PriorityQueue LeftistTree PairingHeap FibHeap

后面三个都没有提供拷贝控制,懒得写

二.非容器数据结构 1.vEBTree

存放一定范围内的整数的数据结构。利用了一些模板的技巧摆脱了指针。

2.BIT BITTree

普通的树状数组和树状数组模拟的平衡树

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.高精整数

BigInt UInt

十进制/二进制高精整数,后者的各种运算要快的多。

2.SharedPtr

简化的智能指针实现,比shared_ptr小的多(当然能力也弱一些)。

五.C++黑科技

1.模板元编程

ListT 编译期链表

SetT 编译期可持久化Treap

TypeName

准确输出类的名字,与之相比,typeid有可能丢失引用/const信息。这个用来调一些模板的bug很好用。

2.IterTool

for (auto i : slice(filter(vec,[](int x){return x % 2 == 0;}), 0, 10))
  std::cout << i << ' ';

大概就是这种画风的吧。

六.失败的作品

Trie

跑的比装string的map还慢...

SegmentTree

除了拖慢编译时间之外什么也做不了

About

蒟蒻实现的一些数据结构,大体上模仿stl


Languages

Language:C++ 99.6%Language:Python 0.4%Language:Makefile 0.0%