我想知道哪个更有效率。
std::map< String, std::set<int> >
或
std::multimap< String, int >
修改 我不打算用这些地图做任何与众不同的事情。标准插入,删除,修改,搜索。每个集合或多键字符串的大小不应超过100个。
答案 0 :(得分:10)
我相信这是依赖于实现的,但是(未)教育的猜测:
实际上,它取决于您将在multimap
或std::set
中保留的整数数量。 multimap
很可能在密钥的log(n)搜索之后使用值的线性搜索。如果你有大量的整数值,那么log(n)搜索键后跟log(n)搜索值可能会稍快一些。
但是,就效率而言,将map
或multimap
中的任何内容与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方法。语法也更好。我希望性能和内存使用的差异不是很大。