C++:容器替代矢量/大尺寸

C++: container replacement for vector/deque for huge sizes

本文关键字:C++      更新时间:2023-10-16

所以我的应用程序有包含 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等。它具有恒定的时间插入和查找,给定一个良好的哈希算法。有了你的"庞大"数据集,哈希图很可能会满足你的需求。对应用程序进行细微更改以涵盖接口差异是微不足道的。

相关文章:
  • 没有找到相关文章