编辑: 请注意,我不是在问为什么multimap不能包含重复键.
允许重复键值对的multimap背后的基本原理是什么?(不是钥匙)
#include <map>
#include <string>
#include <iostream>
int
main(int argc, char** argv)
{
std::multimap<std::string, std::string> m;
m.insert(std::make_pair("A", "B"));
m.insert(std::make_pair("A", "B"));
m.insert(std::make_pair("A", "C"));
std::cout << m.size() << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这打印3,有点让我感到惊讶,我期望multimap表现得像一对对,所以我期待2.
直观地说,它与C++ std::map行为不一致,insert它并不总是改变地图(而不是operator[]).
它背后有理由,还是随意的?
MSa*_*ers 18
Multimap只有一个谓词排序键.它没有方法来确定值是否相等.值"A"是值"a"的重复吗?没有值的第二个谓词,没有任何说明.因此,在多图中讨论重复值甚至没有意义.
如果您想要一个存储对的容器,并强制执行该对的两个部分的唯一性,请查看boost::multi_index_container.它非常灵活,但结果却需要大量的参数.
Sjo*_*erd 12
编辑:这个答案不再回答当前的问题.我会保持它原样,因为它得到了很多投票,所以它必须对某些人有用.
在多在multimap看台的事实,同样的按键可能会出现多个倍.
标准对用作值的类型没有限制,因此不能假设operator==()已定义.因为我们不希望代码的结果取决于是否定义了运算符==(),所以从不使用它.
std::multimap不是替代品std::map.正如您所注意到的,当多次插入相同的密钥时,它的行为会有所不同.如果你想要std::map的行为,请使用std::map.
还有一个std::multiset.
理性:有时人们希望保留所有旧条目以获得相同的密钥.[待定:在此处插入一些示例]
就个人而言,我几乎没用过std::multimap.如果我想要同一个键的多个条目,我通常依赖std::map<std::vector<T> >.