是否有理由在一个结构中偏好一个变量的多个unordered_map?

时间:2015-06-02 15:15:38

标签: c++

我有一个包含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。

但是,对于每个字段,许多不同的变量代码可能很难快速维护。

是否值得单独进行,还是可以采用更方便的方式?

3 个答案:

答案 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)

我不认为两张地图会更快。提取值始终包括搜索地图。因此,如果您需要类型和高度,则必须搜索两次(在两个不同的地图中)。所以在这种情况下它实际上更慢。

关于记忆,使用一张地图效率更高。

相关问题