Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:容器替换用于大尺寸的vector/deque_C++_Boost_Stl_Containers_Large Data - Fatal编程技术网

C++ C++;:容器替换用于大尺寸的vector/deque

C++ C++;:容器替换用于大尺寸的vector/deque,c++,boost,stl,containers,large-data,C++,Boost,Stl,Containers,Large Data,因此,我的应用程序具有包含1亿或更多元素的容器 我正在寻找一个在时间上比std::deque(更不用说std::vector)更好的容器,它在容器中频繁插入和删除。。。包括中间附近。对第n个元素的访问时间不需要像vector一样快,但肯定要比std::list中的完全遍历(每个元素都有巨大的内存开销)好 元素应该按索引顺序处理(如vector、deque、list),所以std::set或std::unordered_set也不能很好地工作 在我坐下来自己编写这样一个容器的代码之前:有人见过这样

因此,我的应用程序具有包含1亿或更多元素的容器

我正在寻找一个在时间上比std::deque(更不用说std::vector)更好的容器,它在容器中频繁插入和删除。。。包括中间附近。对第n个元素的访问时间不需要像vector一样快,但肯定要比std::list中的完全遍历(每个元素都有巨大的内存开销)好

元素应该按索引顺序处理(如vector、deque、list),所以std::set或std::unordered_set也不能很好地工作

在我坐下来自己编写这样一个容器的代码之前:有人见过这样的野兽吗?我很确定STL没有类似的东西,我没有找到可以使用的东西,但我可能错了


有什么提示吗?

如果你的应用程序以大数据为中心,有一个完整的STL替代品:

  • STXXL-

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

1)如果数据非常稀疏,即有许多零或可以这样表示,我强烈建议使用一种数据结构,利用这一点:

  • 对于矩阵
  • 用于哈希映射
2) 散列映射应该对您描述的所有操作都执行O(1),我前面提到的sparsehash实现特别节省空间;它还包括一个
sparsetable
类型,它的级别稍微低一点,可以用来代替数组


3) 如果严格的排序不是那么重要(可能是这样,因为您提到的元素应该按索引排序),您可以
交换
要擦除的元素到向量的末尾,然后
调整大小
以在O(1)中进行移除。插入将是
向后推

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

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

当然,这是你感兴趣的“可索引”部分——你实际上不想对项目进行排序。所以我需要做一些修改,作为练习离开


您可能会发现,1亿个列表节点开始占用32位的地址空间,但在64位中可能不是问题。

就像我曾经编写的32GiB或更大(带有内存映射)的数据集(例如,用于地形渲染的四叉树)一样。但是我必须问“你已经看了什么”:只是一个提示,向量在中间运行的效果更好。特别是如果您最初添加了一个
保留(1亿)
。@phresnel我查看了容器描述中的STL和Boost(v1.50)是否有一个容器声称拥有我需要的东西,那就没有运气了。@Boperson是的,的确如此。但是,当在容器的前40%中插入、删除时,deque会更快。我曾经测试过一个50m元素容器,随机插入和删除,但每个位置都有一次。差异小到足以让我接受deque,这是因为在末端不断插入数据的额外好处。@BaCh:Btw,1亿不是一个大数字,只是95兆。这些元素到底有多大?不错,但不是我需要的。数据仍然需要保存在内存中,因为对它的访问有时非常随机,我想这会破坏磁盘。说到节省空间的哈希映射,还有。啊,我忘了提到稀疏性。不,数据不是稀疏的,因为在一个包含n个元素的容器中,所有n个元素都被使用。不幸的是,严格的排序很重要。@BaCh,你使用索引的确切目的是什么?
insert
remove
和检索频率之间是否存在数量级的差异,以便我们可以确定优先级?我通常使用迭代器遍历容器,但有时需要直接访问第n个元素。然后我真的需要容器中的第n个元素,因为容器表示一个有序的序列(按索引排序)。映射和散列映射无法满足“按索引排序”的先决条件。@BaCh键值对,int,data。。。int是索引。简单的修正。除了当你插入或删除时,一半项目的索引会改变,所以你的哈希映射的一半需要更新。不是最优的。也许你可以在地图上使用真正的稀疏密钥算法?如果对1亿个项目使用32位键,则每个项目的键值范围为40+个。使用64位意味着每个项目的键值范围超过1800亿。你提前知道你有多少东西吗?当然,您必须检查冲突并对此进行解释,但这很容易(在插入之前查找,如果存在,则根据您想要执行的操作移动到下一个或上一个元素,将元素键的一半相加,您就有了新键)@ierceg这主意不错。我需要检查100m元素的内存开销,但绝对值得一试,因为初始元素之间的180B键值就足够了。使用STL,我只能使用map,而不是无序的_map,因为我还需要从第一个元素到最后一个元素(按顺序)遍历数据集。需要检查谷歌稀疏库。是的,这是一个好的。我在一个更复杂的类中已经有了类似的东西,但现在希望有一个已经存在的类。。。运动很好,但如果我能自己写一篇,我可以