哪个向量和地图使用更少的内存(大量数据和未知大小)
Which vector and map, uses less memory (large set of data and unknown size)
我想知道在 std::map
和 std::vector
之间哪个容器在处理大量数据时使用的内存更少。
很多帖子都在谈论效率,我的首要任务不是效率而是内存消耗。所以,如果我们不知道我们的数据数量(在我的例子中可能超过 12,000,000 个条目,每个条目都是一个 20 个字符的字符串),map 真的比 vector 好吗?
A std::vector
必须 在连续内存中组织字符串。 (标准坚持这一点)。因此,对于 std::vector
,您示例中的连续内存量至少为 sizeof(string) * 12,000,000
。幸运的是,每个字符串可能在堆中都有其缓冲区:20 个字符大约是 std::string
为短字符串使用固定缓冲区的实现的截止值。
std::map
不会有这种连续性问题,因此在这种情况下可能是一个更好的容器。但是,总的来说,它可能会消耗更多内存。但是程序会更容易获取内存。
取决于您要解决的问题。基本上,std::vector 使用行内存(因为你的数据很大,确保你有一个),但是 std::map 可以从内存的不同部分获取每个节点。相反,std::map 为相同的数据使用更多的内存,因为节点之间的指针操作。
对于您注意到的特定大小,您可能需要考虑一些不会走向任何极端的东西:不是连续的内存数组,也不是基于单节点的树。
有些选项是
a(内存驻留)B tree
一棵数字树
如果你想将数据保存在连续的内存中,你应该选择 std::vector
否则,如果你更喜欢基于节点的数据结构并且需要大量的插入和删除操作,我会建议 std::list
相反 std::map
。
如果您更喜欢基于节点的数据结构并保持数据结构元素之间的顺序并且没有键值对,我更喜欢 std::set
而不是 std::map
。
如果您更喜欢基于节点的数据结构,将数据作为键值对,并且保持元素之间的顺序取决于数据的键值,我更喜欢 std::map
我想知道在 std::map
和 std::vector
之间哪个容器在处理大量数据时使用的内存更少。
很多帖子都在谈论效率,我的首要任务不是效率而是内存消耗。所以,如果我们不知道我们的数据数量(在我的例子中可能超过 12,000,000 个条目,每个条目都是一个 20 个字符的字符串),map 真的比 vector 好吗?
A std::vector
必须 在连续内存中组织字符串。 (标准坚持这一点)。因此,对于 std::vector
,您示例中的连续内存量至少为 sizeof(string) * 12,000,000
。幸运的是,每个字符串可能在堆中都有其缓冲区:20 个字符大约是 std::string
为短字符串使用固定缓冲区的实现的截止值。
std::map
不会有这种连续性问题,因此在这种情况下可能是一个更好的容器。但是,总的来说,它可能会消耗更多内存。但是程序会更容易获取内存。
取决于您要解决的问题。基本上,std::vector 使用行内存(因为你的数据很大,确保你有一个),但是 std::map 可以从内存的不同部分获取每个节点。相反,std::map 为相同的数据使用更多的内存,因为节点之间的指针操作。
对于您注意到的特定大小,您可能需要考虑一些不会走向任何极端的东西:不是连续的内存数组,也不是基于单节点的树。
有些选项是
a(内存驻留)B tree
一棵数字树
如果你想将数据保存在连续的内存中,你应该选择 std::vector
否则,如果你更喜欢基于节点的数据结构并且需要大量的插入和删除操作,我会建议 std::list
相反 std::map
。
如果您更喜欢基于节点的数据结构并保持数据结构元素之间的顺序并且没有键值对,我更喜欢 std::set
而不是 std::map
。
如果您更喜欢基于节点的数据结构,将数据作为键值对,并且保持元素之间的顺序取决于数据的键值,我更喜欢 std::map