在std :: map

时间:2018-11-30 17:55:28

标签: c++

我试图用两个键创建一个std::map。我可以使用std::pair进行创建,也可以创建一个结构并将其用作键。

在我的软件中,有很多搜索功能。该功能通过第一键或第二键进行搜索。

如果我在地图上有大约1000个物品,我想如果要搜索它会花费一些时间。因此,我认为如果我制作另一个std::map并持有第二个键,并且该值是第一个键,那么我可以取该值并在另一个映射中搜索以获得真实值。

但是我猜测这将占用更多的内存。在这种情况下最好的选择是什么?

2 个答案:

答案 0 :(得分:0)

暴力法

您可以将项目存储在std::vector中,并具有两个映射:第一个具有第一个键和指向矢量项目的指针(或索引),第二个具有第二个键和指向矢量项目的指针(或索引) 。问题是修改集时要维护所有三个容器。

指针与索引:指针在注释中正确指出是危险的,但如果要从向量中删除项目,则指针更简单。否则索引会更安全。

智能方法

您可以使用专为与您的情况完全相同的容器设计的Boost.MultiIndex容器。

答案 1 :(得分:0)

这是您必须解决的工程决策。

仅当您知道key1和key2键集冲突时,多重映射才有意义(IMHO)。否则,为什么不将两个键插入同一映射中,每个对应的值都引用您的对象?

您不想复制对象,因此可以将它们放在向量中,然后将向量索引作为映射值。或使用键到指针的映射等。

1k项实际上并不多,因此我在这里不关心内存的使用,但是使用映射而不是unordered_map可能会引起关注(rb树与哈希表)。

此外,如果您从地图上删除项目,则需要同时删除两个键,因此请务必对此加以考虑。