C ++:容器替换大小的vector / deque

时间:2012-07-26 15:18:04

标签: c++ boost stl containers large-data

因此我的应用程序拥有包含1亿个元素的容器。

我正在寻找一个行为 - 时间方面 - 比std :: deque(更不用说std :: vector)在整个容器上频繁插入和删除... ...包括附近中间。对第n个元素的访问时间不需要像vector那样快,但是应该比std :: list(每个元素都有大量的内存开销)定义要好于完全遍历。

元素应按索引排序(如vector,deque,list),因此std :: set或std :: unordered_set也不能正常工作。

在我坐下来自己编写这样一个容器之前:有没有人见过这样的野兽?我很确定STL没有这样的东西,期待BOOST我找不到我能用的东西,但我可能错了。

任何提示?

4 个答案:

答案 0 :(得分:3)

如果你的应用程序以这些数据为中心,那么大数据的整个STL替换:


编辑:我实际上回答得有点快。 1亿不是一个很大的数字。例如,如果每个元素是一个字节,则可以将其保存在96MiB阵列中。因此,无论STXXL是否有用,元素的大小都应该大得多。

答案 1 :(得分:1)

我认为您可以使用跳过列表获得所需的性能特征:

https://en.wikipedia.org/wiki/Skip_list#Indexable_skiplist

这是您感兴趣的“可索引”部分,当然 - 您实际上并不希望对项目进行排序。因此,我需要进行一些修改,作为练习。

您可能会发现1亿个列表节点开始对32位地址空间造成压力,但64位可能不是问题。

答案 2 :(得分:0)

1)如果数据非常稀疏,即有很多零或可以表示为这样,我强烈推荐一种利用它的数据结构:

2)对于你描述的所有操作,哈希映射都应该执行O(1),前面提到的sparsehash实现特别节省空间;它还包括一个sparsetable类型,它更低级别,可用于代替数组。

3)如果严格排序不那么重要(可能是因为你提到的元素应该按索引排序),你可以swap要删除的元素到向量的末尾,然后resize在O(1)中删除。插入只是push_back

答案 3 :(得分:0)

尝试哈希映射。 STL有几个,都带有无序的命名前缀,例如unorderd_map等。它具有恒定的时间插入和查找,给出了良好的散列算法。使用“巨大”数据集,哈希映射很可能会满足您的需求。对应用程序进行细微更改以覆盖接口的差异是微不足道的。