std :: multimap的用例

时间:2011-06-23 15:45:31

标签: c++11

我不太了解这个数据结构的目的。 std::multimap<K, V>std::map<K, std::vector<V>>之间有什么区别。同样适用于std::multiset - 它可能只是std::map<K, int>,其中int计算K的出现次数。我是否遗漏了这些结构的用法?

3 个答案:

答案 0 :(得分:5)

反例似乎是有序的。

考虑按名称分组的AdressList中的PhoneEntry。

int AdressListCompare(const PhoneEntry& p1, const PhoneEntry& p2){
    return p1.name<p2.name;
}

multiset<PhoneEntry, AdressListCompare> adressList;

adressList.insert( PhoneEntry("Cpt.G", "123-456", "Cellular") );    
adressList.insert( PhoneEntry("Cpt.G", "234-567", "Work") );
// Getting the entries
addressList.equal_range( PhoneENtry("Cpt.G") ); // All numbers

使用set + count这是不可行的。如果不需要此行为,则对象+计数方法似乎更快。例如,multiset :: count()成员状态

  

“复杂性:对数大小+   计数线性。“

答案 1 :(得分:2)

您可以使用make建议的替换,并提取类似的行为。但是接口与处理常规标准容器时的界面非常不同。这些容器的主要设计主题是它们共享尽可能多的接口,使它们尽可能互换,以便可以选择适当的容器而无需更改使用它的代码。

例如,std::map<K, std::vector<V>>会有迭代器取消引用std::pair<K, std::vector<V>>而不是std::pair<K, V>std::map<K, std::vector<V>>::Count()将无法返回正确的结果,无法解释向量中的重复项。当然,您可以更改代码以执行纠正此操作所需的额外步骤,但现在您以不同的方式与容器连接。您无法稍后放入unordered_map或其他一些地图实施,以确保其效果更佳。

从更广泛的意义上讲,您通过在代码中处理容器实现细节而不是拥有一个处理它自己业务的容器来打破容器抽象。

您的编译器std::multimap的实现完全可能只是std::map<K, std::vector<V>>的包装器。或者它可能不是。它可以更有效和友好的对象池分配(哪些向量不是)。

使用std::map<K, int>代替std::multiset是相同的情况。 Count()不会返回预期值,迭代器不会迭代重复项,迭代器将取消引用std::pair<k, int>而不是直接取消引用`K。

答案 2 :(得分:-1)

multimap或multiset允许你拥有重复键的元素。

即一个集合是一个非有序的元素组,在{A,B,C} == {B,C,A}

中都是唯一的