乐闻世界logo
搜索文章和话题

std::multimap<key,value>和std::map<key、std::set<value>之间有什么区别

5 个月前提问
4 个月前修改
浏览次数44

1个答案

1

在C++标准库中,std::multimapstd::map配合std::set使用,这两种结构提供了关联数据存储的不同方式,主要区别在于它们各自的使用场景和数据组织方式。

std::multimap<key, value>

std::multimap是一个允许键(key)重复的关联容器。它可以存储多个值(value)在相同的键(key)下。这意味着一个键可以映射到多个值。

优点:

  • 直接支持一键多值的结构,不需要额外的数据结构支持。
  • 插入新的键值对非常简单,即使键是重复的。

缺点:

  • 访问特定键的所有值时可能需要遍历,因为所有值都是在同一个键下线性存储的。

使用场景示例: 如果我们要存储一个学校里每个科目的多名老师,可以使用std::multimap,其中科目是键,老师的名字是值。

cpp
std::multimap<std::string, std::string> subject_teachers; subject_teachers.insert(std::make_pair("Math", "Mr. Smith")); subject_teachers.insert(std::make_pair("Math", "Mrs. Johnson"));

std::map<key, std::set>

std::map是一个不允许键重复的关联容器,但通过将值定义为std::set,可以间接地支持一个键对应多个不重复的值。在这种结构中,每个键映射到一个集合(set),集合中保存着所有的值。

优点:

  • 自动为每个键维护一组有序且不重复的值集合。
  • 提供高效的查找、删除和插入操作,特别是当需要检查值是否已存在于集合中时。

缺点:

  • 相比于std::multimap,在插入时需要更多的操作,如检查值是否已存在。

使用场景示例: 如果需要存储每个科目的独立教师名单,并确保名单中不重复,使用std::map配合std::set是更好的选择。

cpp
std::map<std::string, std::set<std::string>> subject_teachers; subject_teachers["Math"].insert("Mr. Smith"); subject_teachers["Math"].insert("Mrs. Johnson"); // 如果尝试再次插入"Mrs. Johnson",将不会有任何效果,因为set中已经存在。

总结

选择std::multimap还是std::map配合std::set取决于具体需求:

  • 如果需要存储多个可能重复的值并且对值的唯一性没有要求,std::multimap是合适的。
  • 如果需要存储的值必须是唯一的,并且希望通过键快速访问这些值的集合,那么使用std::map配合std::set将是更好的选择。
2024年6月29日 12:07 回复

你的答案