github: https://github.com/lidotcircle/curly
curly 实现了std::map
, std::multimap
, std::set
和 std::multiset
的替代品。区别在于 curly 实现的容器的迭代器是 random access iterartor(严格来说并不是, 因为单个寻址操作的时间复杂度为 O(lg n), 而指针为 O(1))。
下图是和 STL 容器的性能对比, 包括insert
, erase
, copy
, std::distance3
和 std::advance
。
时间复杂度的对比 std::set
vs curly::pset
vs curly::set2
(curly::set2
的迭代器和std::set
一样是bidirectional iterator
, 仅用于测试 红黑树 实现的性能)
操作 | std::set |
curly::set2 |
curly::pset |
---|---|---|---|
insert | O(lg n) | O(lg n) | O(lg n) |
erase | O(lg n), amortized O(n) | O(lg n) | O(lg n), amortized O(n) |
copy assignment | O(n) | O(n) | O(n) |
std::distance | O(n) | O(lg n) | O(n) |
std::advance(iter, k) | O(k) | O(lg n) | O(k) |
包含单个文件 include rbtree.hpp 即可
STL container | curly container | curly container without random access iterator |
---|---|---|
std::set |
curly::pset |
curly::set2 |
std::multiset |
curly::pmultiset |
curly::multiset2 |
std::map |
curly::pmap |
curly::map2 |
std::multimap |
curly::pmultimap |
curly::multimap2 |
PS:如果有用到寻址或者求第 K 元素的需求还是可以尝试下的,其他操作的性能还是不如 STL 的容器。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.