为什么multimap允许重复的键值对?

Ale*_*x B 18 c++ multimap

编辑: 注意,我不是在问为什么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.它非常灵活,但结果却需要大量的参数.

  • 虽然你的答案是合理的,但是一个小小的挑剔:我认为第一段反映了因果关系.Multimap不强制每个键的值的唯一性*因为*它只有键的谓词,而是只有键*的谓词,因为*它不强制每个键的值的唯一性. (3认同)
  • 从某种意义上说,这个问题具有相同的逻辑逆转.您可以拥有一个不允许重复键值对的容器,但不再是`std :: multimap`. (2认同)

Sjo*_*erd 12

编辑:这个答案不再回答当前的问题.我会保持它原样,因为它得到了很多投票,所以它必须对某些人有用.

multimap看台的事实,同样的按键可能会出现多个倍.

标准对用作值的类型没有限制,因此不能假设operator==()已定义.因为我们不希望代码的结果取决于是否定义了运算符==(),所以从不使用它.

std::multimap不是替代品std::map.正如您所注意到的,当多次插入相同的密钥时,它的行为会有所不同.如果你想要std::map的行为,请使用std::map.

还有一个std::multiset.

理性:有时人们希望保留所有旧条目以获得相同的密钥.[待定:在此处插入一些示例]

就个人而言,我几乎没用过std::multimap.如果我想要同一个键的多个条目,我通常依赖std::map<std::vector<T> >.