我有一个包含2d坐标x和y的点类(" Point")。现在我想要一个带有字段的二维地图,我使用unordered_map。
在这张地图的每个字段上,我想保存几个值(例如类型,高度等)。
我意识到我可以有另一个类/结构:
struct fieldData{
int type;
float height;
}
unordered_map<Point, fieldData> myMap;
或者我可以为每个人提供一张无序地图:
unordered_map<Point, int> mapType;
unordered_map<Point, float> mapHeight;
我目前的理由是,单独进行此操作的优点是访问速度会快得多,因为我只提取例如当我需要类型时的类型而不是两者都需要类型。如果我使用结构,则操作将始终在整个数据集上运行。一个字段最后可能包含大量数据,我可能希望程序在有限的机器上运行,如Raspberry Pi。
但是,对于每个字段,许多不同的变量代码可能很难快速维护。
是否值得单独进行,还是可以采用更方便的方式?
答案 0 :(得分:4)
从std::unordered_map
检索元素时,始终会获得对元素的引用,而不是元素的副本。有关详细信息,请参阅here。因此,即使您的无序地图mapped_type
是一个非常大的结构,如果您只需要一个字段,则只会检索该单个字段。以下两个片段在运行时性能方面是等效的:
auto it = map.find(key);
if( it != map.end())
{
LargeStruct * ls = &*it;
do_something_with(ls->small_field);
}
和
auto it = map.find(key);
if( it != map.end())
{
LargeStruct & ls = *it;
do_something_with(ls.small_field);
}
后者更像是惯用的C ++。
答案 1 :(得分:1)
您应该更喜欢单个*map
:
对所有字段的访问将具有单一访问成本(例如,在这种情况下,主要是哈希函数调用)
对于大量字段,您可能使用结构(或至少是元组)进行更好的封装
答案 2 :(得分:0)
我不认为两张地图会更快。提取值始终包括搜索地图。因此,如果您需要类型和高度,则必须搜索两次(在两个不同的地图中)。所以在这种情况下它实际上更慢。
关于记忆,使用一张地图效率更高。