我试图用两个键创建一个std::map
。我可以使用std::pair
进行创建,也可以创建一个结构并将其用作键。
在我的软件中,有很多搜索功能。该功能通过第一键或第二键进行搜索。
如果我在地图上有大约1000个物品,我想如果要搜索它会花费一些时间。因此,我认为如果我制作另一个std::map
并持有第二个键,并且该值是第一个键,那么我可以取该值并在另一个映射中搜索以获得真实值。
但是我猜测这将占用更多的内存。在这种情况下最好的选择是什么?
答案 0 :(得分:0)
暴力法
您可以将项目存储在std::vector
中,并具有两个映射:第一个具有第一个键和指向矢量项目的指针(或索引),第二个具有第二个键和指向矢量项目的指针(或索引) 。问题是修改集时要维护所有三个容器。
指针与索引:指针在注释中正确指出是危险的,但如果要从向量中删除项目,则指针更简单。否则索引会更安全。
智能方法
您可以使用专为与您的情况完全相同的容器设计的Boost.MultiIndex容器。
答案 1 :(得分:0)
这是您必须解决的工程决策。
仅当您知道key1和key2键集冲突时,多重映射才有意义(IMHO)。否则,为什么不将两个键插入同一映射中,每个对应的值都引用您的对象?
您不想复制对象,因此可以将它们放在向量中,然后将向量索引作为映射值。或使用键到指针的映射等。
1k项实际上并不多,因此我在这里不关心内存的使用,但是使用映射而不是unordered_map可能会引起关注(rb树与哈希表)。
此外,如果您从地图上删除项目,则需要同时删除两个键,因此请务必对此加以考虑。