从几个map <key,value>?</key,value>中搜索的最佳方法是什么?

时间:2011-07-02 17:00:20

标签: c++ map

我创建了一个vector,其中包含多个map<>

vector<map<key,value>*> v;
v.push_back(&map1);
// ...
v.push_back(&map2);
// ...
v.push_back(&map3);

在任何时候,如果必须检索value,我会遍历vector并在每个key元素中找到map(即{{ 1}},v[0]等)直到找到它为止。这是最好的方法吗?我愿意接受任何建议。这只是我给出的一个想法,我还没有这样实现(如果有任何错误,请显示)。

修改:找不到v[1]元素并不重要。在多个模块中,准备了不同的map。随着代码的进展,它们会逐一添加。每当搜索到map时,都应在所有key中搜索结果,直到那时

4 个答案:

答案 0 :(得分:3)

如果没有关于目的和用途的更多信息,可能有点难以回答。例如,是否需要有多个地图对象?如果没有,那么您可以将所有项目存储在单个地图中并完全消除该向量。这样做查找会更有效。如果地图中有重复的条目,则每个值的关键字可以包括当前定义放置值的地图的区分信息。

答案 1 :(得分:1)

如果您需要知道找到密钥的子图,请尝试:

unordered_set<key, pair<mapid, value>>

搜索的复杂性要高得多。

答案 2 :(得分:1)

如果密钥不重叠,即通过所有地图都是唯一的,那么我建议setunordered_set使用自定义比较仿函数,因为这将有助于查找。或者甚至使用新地图扩展第一张地图,如果分析显示足够快/更快。

如果密钥不是唯一的,请使用multisetunordered_multiset再次使用自定义比较仿函数。

您也可以手动对vector进行排序,然后使用binary_search进行搜索。无论如何,我建议使用树来存储所有地图。

答案 3 :(得分:1)

这取决于您的地图是如何“独立创建”的,但如果它是一个选项,我只会制作一个全局地图(或多地图)对象并将其传递给您的所有创作者。如果您到处都有许多小地图,您只需在全局地图上调用insert即可将地图合并到其中。

这样你只有一个对象可以在其中执行查找,效率相当高(多图的O(log n),unordered_multimap的预期O(1))。

这也使您不必将原始指针传递给周围的容器并且必须清理!