我不太理解这种数据结构的目的。 std::multimap<K, V>
和 std::map<K, std::vector<V>>
之间有什么区别呢?std::multiset
也是一样,它只需要是一个计算K出现次数的 std::map<K, int>
就可以了。这些数据结构的用途是否有所遗漏?
我不太理解这种数据结构的目的。 std::multimap<K, V>
和 std::map<K, std::vector<V>>
之间有什么区别呢?std::multiset
也是一样,它只需要是一个计算K出现次数的 std::map<K, int>
就可以了。这些数据结构的用途是否有所遗漏?
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
“复杂度:大小对数级别+计数线性级别。”
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。多重映射或多重集合允许您拥有具有重复键的元素。
例如,集合是一组非有序元素,这些元素在{A,B,C} == {B,C,A}中都是唯一的。
map<std::string, std::vector<rest of PhoneEntry>>
非常相似。虽然它与我提出的替代方案不完全相同,但也可以进行分解。 - Puppymap<K, vector<V>>
,那么数据只会被存储一次。在你的例子中,multiset会重复存储键,因为它是值的一部分。 - Puppy