我有一个包含二维坐标 x 和 y 的点类(“Point”)。现在我想要一个带有字段的 2d map ,我使用了 unordered_map。
在此 map 的每个字段上,我想保存几个值(例如类型、高度等)。
我意识到我可以为此使用另一个类/结构:
struct fieldData{
int type;
float height;
}
unordered_map<Point, fieldData> myMap;
或者我可以为每个人准备一张无序 map :
unordered_map<Point, int> mapType;
unordered_map<Point, float> mapHeight;
我目前的推理是,单独进行的优点是访问速度会快得多,因为我只提取例如当我需要类型时的类型,而不是当我只需要类型时的类型。如果我使用结构,操作将始终在完整的数据集上运行。一个字段最终可能包含大量数据,我可能希望程序在有限的机器上运行,例如 Raspberry Pi。
但是,由于每个字段都有许多不同的变量,代码可能难以快速维护。
值得单独做还是我可以做更方便的方法?
最佳答案
当您从 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++ 的习惯。
关于c++ - 是否有理由更喜欢一个变量的多个 unordered_map 而不是一个结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30600032/