C++:容器替代矢量/大尺寸
C++: container replacement for vector/deque for huge sizes
所以我的应用程序有包含 1 亿个或更多元素的容器。
我正在寻找一个容器,它在容器中频繁插入和删除方面表现得比 std::d eque(更不用说 std::vector(更好......包括靠近中间。对第 n 个元素的访问时间不需要像 vector 那样快,但肯定应该比像 std::list 那样的完全遍历更好(无论如何,每个元素都有巨大的内存开销(。
元素应该按索引排序(如向量、deque、list(,所以 std::set 或 std::unordered_set 也不能很好地工作。
在我坐下来自己编写这样的容器之前:有人见过这样的野兽吗?我很确定 STL 没有这样的东西,寻找 BOOST,我没有找到我可以使用的东西,但我可能是错的。
有什么提示吗?
大数据有一个完整的STL替代品,以防你的应用以这些数据为中心:
- STXXL - http://stxxl.sourceforge.net/
编辑:我实际上回答得有点快。 1亿并不是一个很大的数字。 例如,如果每个元素都是一个字节,则可以将其保存在96MiB数组中。因此,无论 STXXL 是否有用,元素的大小都应该大得多。
我认为您可以通过跳过列表获得所需的性能特征:
https://en.wikipedia.org/wiki/Skip_list#Indexable_skiplist
当然,这是您感兴趣的"可索引"部分 - 您实际上并不希望对项目进行排序。因此,需要一些修改,我将其作为练习。
您可能会发现 1 亿个列表节点开始使 32 位地址空间紧张,但在 64 位中可能不是问题。
1(如果数据是高度稀疏的,即有很多零或可以这样表示,我强烈推荐一种利用这一点的数据结构:
- 矩阵的稀疏库++ 哈希
- 映射的稀疏哈希
2(哈希映射应该对你描述的所有操作做O(1(,我前面提到的稀疏哈希实现特别节省空间;它还包括一个 sparsetable
类型,该类型更底层,可用于代替数组。
3(如果严格排序不是那么重要(可能是,因为你提到的元素应该按索引排序(,你可以swap
要擦除的元素到向量的末尾,然后resize
在O(1(中进行删除。插入只是push_back
.
尝试哈希映射。STL有几个,都带有无序命名前缀,如unorderd_map等。它具有恒定的时间插入和查找,给定一个良好的哈希算法。有了你的"庞大"数据集,哈希图很可能会满足你的需求。对应用程序进行细微更改以涵盖接口差异是微不足道的。
- 没有找到相关文章