multimap vs map with set

multimap vs map with set

本文关键字:set with map vs multimap      更新时间:2023-10-16

我想知道哪一个更有效率。

std::map< String, std::set<int> >

std::multimap< String, int >
编辑:

我不打算用这些地图做什么不寻常的事情。标准的插入、删除、修改、查找。每个集或多键字符串的大小不应超过100。

我认为这是实现相关的,但(非)有根据的猜测:

在实践中,它取决于您将在multimapstd::set中保留的整数的数量。multimap很可能在对键进行log(n)搜索后对值进行线性搜索。如果您有大量的整数值,那么对键进行log(n)次搜索,然后对值进行log(n)次搜索,可能会稍微快一些。

然而,就效率而言,使用string键在mapmultimap中存储任何东西几乎肯定会超过这两种情况的差异。

如下所述,multimap可能更容易使用,更易于维护,从而具有明显的优势。

无论multimap是否存在,"set"选项都将消除重复的键+值对。

它们实际上并不相等。multimap<X,Y>允许存储重复的键值对,而map<T, set<X>>不允许。

multimap<int, int> m;
m.insert(make_pair(2, 3));
m.insert(make_pair(2, 3)); // This changes the size of m!

map<int, set<int>> m;
m[2].insert(3);
m[2].insert(3); // This does nothing.

所以我会使用set方法,除非你需要重复的键值对。语法也更好。我希望性能和内存使用的差异不是那么大。

如果到目前为止你对这些答案不满意(不是说你不满意),而我绝对是被迫回答的,我也会给出我的有根据的"猜测":

要插入,multimap似乎更"有效"。使用映射方法,首先必须检索,然后对集合执行操作。要删除/检索,map似乎更"高效"。

我不能肯定地说,但考虑到multimap被设计成另一个是表达式的,它应该更好地具体使用multimap,它更有意义,它也有成员函数与multimap一起工作作为一个概念,这些函数使用其他方法会有点时髦。

std::multimap<String,>最有可能更节省内存