C++ 哪个向量和映射使用更少的内存(数据集大且大小未知)
我想知道哪个容器在C++ 哪个向量和映射使用更少的内存(数据集大且大小未知),c++,stdvector,stdmap,large-data,C++,Stdvector,Stdmap,Large Data,我想知道哪个容器在std::map和std::vector之间使用的内存更少,而且数据集很大 大量的帖子都在谈论效率,我的重点不是效率而是内存消耗。所以,如果我们不知道数据的数量(在我的例子中,可以超过12000000个条目,每个条目都是一个由20个字符组成的字符串),map真的比vector好吗?astd::vector必须在连续内存中组织字符串。(标准坚持这一点)。因此,对于std::vector,示例中的连续内存量至少为sizeof(string)*12000000。幸运的是,每个字符串可
std::map
和std::vector
之间使用的内存更少,而且数据集很大
大量的帖子都在谈论效率,我的重点不是效率而是内存消耗。所以,如果我们不知道数据的数量(在我的例子中,可以超过12000000个条目,每个条目都是一个由20个字符组成的字符串),map真的比vector好吗?a
std::vector
必须在连续内存中组织字符串。(标准坚持这一点)。因此,对于std::vector
,示例中的连续内存量至少为sizeof(string)*12000000
。幸运的是,每个字符串可能在堆中都有其缓冲区:对于使用固定缓冲区处理短字符串的std::string
实现,大约有20个字符
std::map
不会有这种连续性问题,因此在本例中可能是一个更好的容器。但是,总的来说,它可能会消耗更多的内存。但是程序更容易获得内存。取决于您要解决的问题。基本上,std::vector使用一个行内存(因为数据很大,请确保有一个),但是std::map可以从内存的不同部分获取每个节点。相反,std::map对相同的数据使用更多的内存,因为节点之间的指针操作 > p>对于特定的大小,您可能需要考虑一些不太极端的东西:不是连续的内存数组,也不是单一的基于节点的树。
有些选择是
- a(内存驻留)
- 数字树
std::vector
,否则如果你喜欢基于节点的数据结构并且需要大量的插入和删除操作,我建议你选择std::list
而不是std::map
如果您喜欢基于节点的数据结构,并且在数据结构的元素之间保持顺序,并且没有键值对,那么我更喜欢std::set
而不是std::map
如果您更喜欢基于节点的数据结构,数据作为键值对,元素之间的顺序取决于数据的键值,我更喜欢
std::mapmap
和vector
做不同的事情:map
存储键值对,而不是单个值。通常,关联容器的开销更大,因为它们将指针存储在数据旁边,并单独分配每个节点;但是vector
需要连续内存,如果您让它太频繁地重新分配,可能会导致碎片。唯一真正的答案是测量。Vector包含一个连续数组,因此它需要精确的size()*sizeof(value\u type)
字节的动态存储。地图每条目有一个动态节点,它增加了相当多的开销。我会考虑在这里滚动我自己——有1200万个条目你可以证明它——你想保存多少内存?容纳1200万组20个字符的容器可能比容纳1200万组20个字符(又名字符串)的容器要好。就这一点而言,[a-z]的20个字符串具有10^28个可能值的顺序,在这种情况下,可以将每个字符串表示为96位整数?你准备得到多奇怪?你可以看看和@AndyNewman,我知道,但是对于每个字符串,我有一个包含其他数据的容器。每个字符串都是不同的。但在调整大小时,向量是否会将其所有数据复制到另一个连续的内存行中?或者它保留两行吗?如果向量大小为n,并且你在那里调用resize(m)m>n,它只是将必要的m-n部分添加到向量中,如果m