多图与地图集

时间:2011-09-08 16:07:14

标签: c++ map set std multimap

我想知道哪个更有效率。

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

std::multimap< String, int >

修改 我不打算用这些地图做任何与众不同的事情。标准插入,删除,修改,搜索。每个集合或多键字符串的大小不应超过100个。

6 个答案:

答案 0 :(得分:10)

我相信这是依赖于实现的,但是(未)教育的猜测:

实际上,它取决于您将在multimapstd::set中保留的整数数量。 multimap很可能在密钥的log(n)搜索之后使用值的线性搜索。如果你有大量的整数值,那么log(n)搜索键后跟log(n)搜索值可能会稍快一些。

但是,就效率而言,将mapmultimap中的任何内容与string密钥一起存储几乎肯定会超过两种情况下的差异。

如下所述,multimap可能更容易使用,更清晰,以保持明显的优势。

答案 1 :(得分:4)

“set”选项将消除键+值对重复,无论多重图不会。

答案 2 :(得分:1)

我不能肯定地说,但鉴于multimap的设计是为了做另一个表达式,最好是具体使用multimap,它更有意义,它还有成员函数对于使用多图作为概念,使用其他方法这些函数会有点时髦。

答案 3 :(得分:1)

的std ::多重映射&LT; String,int&gt;很可能是更有效的内存。

答案 4 :(得分:1)

如果到目前为止你对这些答案不满意(并不是说你不是这样)并且我绝对不得不回答,我会给予受过教育的答案#34;猜测&#34;太:

要插入,多地图似乎更有效率&#34;。使用map方法,首先必须检索,然后对集合执行操作。 要删除/检索,地图似乎更有效率&#34;。

答案 5 :(得分:0)

无论如何,它们实际上并不相同。 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方法。语法也更好。我希望性能和内存使用的差异不是很大。