std :: map用于小型稀疏集合

Rot*_*tem 6 c++ visual-studio-2010 visual-c++

给定一个结构MyData,其中存在许多实例(我说最多数百万),对于每个实例,我需要存储一个可能包含最多8个键的值的成员.键将始终是一个int范围0-7,值将始终是浮点的3D点(让我们称之为Point3).

最多,它将包含:

Key | Value  
-------------
0   | [x,y,z]  
1   | [x,y,z]  
2   | [x,y,z]
3   | [x,y,z]
4   | [x,y,z]
5   | [x,y,z]
6   | [x,y,z]
7   | [x,y,z]
Run Code Online (Sandbox Code Playgroud)

但是,在99.9%的情况下,它将包含0或1个键值对,例如:

Key | Value
-------------
1   | [x,y,z]  
Run Code Online (Sandbox Code Playgroud)

std::map<int, Point3>与总是存储8 Point3个数组(每个浮点数4个字节*3个值*8个时隙= 96个字节)和一个BYTE带有位的单个数组相比,如何有效地确定存储空值或单值的内存开销(如果有的话)?哪些插槽包含有意义的值?

一般来说,我的问题是空的或几乎是空的内存开销是std::map多少?

MSa*_*ers 4

地图的内存开销并没有那么糟糕。通常每个节点有几个单词。在“不过早优化”的规则下,使用地图开始肯定是可以的。

也就是说,当您进行优化时,映射将位于要替换的数据结构列表的前列。但此时,您可以分析实际使用的所有不同操作。键和/或值多久更改一次?这是优化之前需要了解的重要信息。

[编辑] 如果我要建议一个结构,它将是 的向量std::pair<int, Point3D>。原因是这可能会提供对齐友好的 16 字节对象。我不会费心对键进行排序,因为这仅对具有多个键/值对的 0.1% 节点有用。

  • @Rotem:这是一个反对 std::map 的论点。Map 有一个廉价的插入(只需要添加一个节点,并打乱几个节点指针)。插入已排序的向量通常意味着移动一半的元素。(所以 O(log N) 与 O(N))。 (3认同)