我想知道哪个更有效率。
std::map< String, std::set<int> >
或者
std::multimap< String, int >
编辑: 我不打算对这些映射进行任何超出寻常的操作。标准的插入、删除、修改、搜索。每个集合或多关键字字符串的大小不应超过100。
我想知道哪个更有效率。
std::map< String, std::set<int> >
或者
std::multimap< String, int >
编辑: 我不打算对这些映射进行任何超出寻常的操作。标准的插入、删除、修改、搜索。每个集合或多关键字字符串的大小不应超过100。
我认为这是实现相关的,但是有一个(不)受过教育的猜测:
实际上,这取决于您将在 multimap 或
std :: set 中保留的整数数量。
multimap
将很可能在键的log(n)搜索后使用值的线性搜索。 如果您有大量整数值,则键的log(n)搜索后跟随值的log(n)搜索可能略快。
但是,从效率的角度来看,在 map 或 multimap 中存储具有 string 键的任何内容几乎肯定会超过两种情况之间的差异。
如下所述,使用 multimap 很可能更易于使用和维护,具有明显的优势。
它们实际上并不等价。一个 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.
std::multimap< String, int > 很可能更加内存高效。
std
命名空间。而且,我的评论真的是想激发你为你的回答添加一个合理性的 ;) - Lightness Races in Orbit
("foo", 1)
的副本,而map+set则不能。 - Kerrek SBmap<string,set<int>>
与第二种替代方案相比没有明显的优势,而且在某些情况下,map<string,vector<int>>
可能更好或更差...不知道问题的具体情况是无法判断的。 - David Rodríguez - dribeas