哪个矢量和地图使用较少的内存(大量数据和未知大小)

时间:2015-05-18 13:07:35

标签: c++ stdvector stdmap large-data

我想知道哪个容器在std::mapstd::vector之间使用较少的内存并使用大量数据。

大量帖子谈论效率,我的优先级不是效率而是内存消耗。所以,如果我们不知道我们的数据的数量(在我的情况下可以超过12,000,000个条目,每个条目是一个20个字符的字符串),地图真的比矢量好吗?

4 个答案:

答案 0 :(得分:3)

std::vector 必须组织连续内存中的字符串。 (标准坚持这一点)。因此,对于sizeof(string) * 12,000,000,示例中的连续内存量至少为std::vector。幸运的是,每个字符串可能在堆中都有它的缓冲区:对于使用固定缓冲区作为短字符串的std::string实现,截止数为20个字符。

std::map不会出现这种连续性问题,因此可能是在此实例中使用的更好的容器。但是,总体而言,它可能会消耗更多内存。但是这个记忆对于程序来说会更容易获得。

答案 1 :(得分:2)

取决于您正在解决的问题。基本上,std :: vector使用行内存(因为你的数据很大,请确保你有一个),但是std :: map可以从内存的不同部分获取每个节点。相反,std :: map对同一数据使用更多内存,因为节点之间的指针操作。

答案 2 :(得分:2)

对于您注意到的特定大小,您可能需要考虑一些不符合任何一个极端的内容:不是连续的内存数组,而不是基于单节点的树。

有些选项

  • a(记忆驻留)B tree

  • 数字树

答案 3 :(得分:1)

如果你想将数据保存在连续内存中,你应该选择std::vector否则如果您更喜欢基于节点的数据结构并且需要进行大量的插入和删除操作,我建议std::list代替std::map {1}}。

如果您更喜欢基于节点的数据结构,并且在数据结构的元素之间保持顺序并且没有键值对,我更喜欢std::set而不是std::map

如果您更喜欢基于节点的数据结构,并将数据作为键值对,并且保持元素之间的顺序取决于数据的关键值,我更喜欢std::map