因此我的应用程序拥有包含1亿个元素的容器。
我正在寻找一个行为 - 时间方面 - 比std :: deque(更不用说std :: vector)在整个容器上频繁插入和删除... ...包括附近中间。对第n个元素的访问时间不需要像vector那样快,但是应该比std :: list(每个元素都有大量的内存开销)定义要好于完全遍历。
元素应按索引排序(如vector,deque,list),因此std :: set或std :: unordered_set也不能正常工作。
在我坐下来自己编写这样一个容器之前:有没有人见过这样的野兽?我很确定STL没有这样的东西,期待BOOST我找不到我能用的东西,但我可能错了。
任何提示?
答案 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等。它具有恒定的时间插入和查找,给出了良好的散列算法。使用“巨大”数据集,哈希映射很可能会满足您的需求。对应用程序进行细微更改以覆盖接口的差异是微不足道的。