36.set和map的区别,multimap和multiset的区别

发布时间 2023-08-03 07:57:34作者: CodeMagicianT

36.set和map的区别,multimap和multiset的区别

1.set和map的区别

std::setstd::map是C++标准库中的两个关联容器,它们都是基于红黑树实现的,但在用途和特性上有一些区别:

1.元素类型

  • std::set:是一个集合容器,其中包含唯一的元素。每个元素的值都是其键值。集合中不能有重复元素。
  • std::map:是一个键值对容器,其中的每个元素都是一个由键和关联值(值)组成的对。每个键在容器中必须是唯一的,但关联值可以重复。

2.存储方式

  • std::set:存储一组有序的唯一元素。当你插入新元素时,它会自动根据元素的值进行排序,并确保没有重复的元素存在。
  • std::map:存储一组有序的键值对。在插入键值对时,它会根据键的值进行排序,并确保每个键在容器中是唯一的。

3.访问元素

  • std::set:可以使用迭代器访问集合中的元素。由于元素是唯一的且按照一定的排序规则存储,你可以很容易地查找特定的元素。
  • std::map:除了使用迭代器访问键值对外,你还可以根据给定的键快速查找对应的值,通过map[key]的方式来访问。

4.用途

  • std::set:常用于维护一组唯一元素,并可以在O(log n)时间内进行插入、删除和查找操作。
  • std::map:常用于建立键值关联关系,通过键快速找到对应的值,并支持在O(log n)时间内对键值对进行插入、删除和查找操作。

在需要维护一组有序且唯一的元素时,std::set是更合适的选择。而在需要建立键值对映射关系时,std::map是更适合的容器。需要注意的是,C++11引入了std::unordered_setstd::unordered_map,它们是基于哈希表实现的关联容器,如果对于元素的有序性没有特殊要求,且对于插入、删除和查找操作的性能有更高的要求,可以考虑使用哈希表来代替红黑树。

2.multimap和multiset的区别

std::multimapstd::multiset是C++标准库中的两种关联容器,它们都允许存储多个具有相同键(在std::multimap中称为关键字)的元素,但在其他方面有一些区别:

1.元素类型

  • std::multimap:是一个键值对容器,其中的每个元素都是一个由键和关联值(值)组成的对。每个键在容器中可以有多个对应的关联值。
  • std::multiset:是一个集合容器,其中包含多个具有相同关键字的元素。集合中的元素只有关键字,并且不能有重复的元素。

2.存储方式

  • std::multimap:存储一组有序的键值对。在插入键值对时,它会根据键的值进行排序,但并不要求关键字唯一。
  • std::multiset:存储一组有序的关键字。在插入关键字时,它会根据关键字的值进行排序,并允许相同关键字的存在。

3.访问元素

  • std::multimap:除了使用迭代器访问键值对外,你还可以根据给定的键快速查找对应的值,通过multimap.equal_range(key)的方式来获取一个迭代器对的范围,表示该键对应的所有值的范围。
  • std::multiset:可以使用迭代器访问集合中的元素。由于集合中的元素只有关键字,并且按照一定的排序规则存储,你可以很容易地查找特定的关键字。

4.用途

  • std::multimap:常用于建立一个键对多个值的映射关系。例如,可以用于存储多个人的姓名和电话号码,其中姓名作为键,而电话号码作为关联值。
  • std::multiset:常用于维护一组具有相同关键字的元素,并可以在O(log n)时间内进行插入、删除和查找操作。

总的来说,std::multimapstd::multiset都允许存储具有相同关键字的多个元素,但std::multimap是一个键值对容器,每个键可以对应多个值,而std::multiset只存储关键字本身,每个关键字只能出现一次。

3.set和multiset的区别

std::setstd::multiset 是 C++ 中的两种关联容器,它们都基于红黑树实现,主要的区别在于是否允许存储重复的元素:

1.元素唯一性

  • std::set:只允许存储唯一的元素。如果试图插入一个已经存在于集合中的元素,那么这个操作将被忽略。
  • std::multiset:允许存储重复的元素。每个元素可以在集合中出现多次。

2.使用场景

  • std::set:适用于需要维护一组有序且唯一的元素的情况。例如,可以用于保存一组学生的唯一 ID。
  • std::multiset:适用于需要维护一组可以包含重复元素的有序集合。例如,可以用于保存一组成绩,其中某些成绩可能会相同。

3.插入操作

  • std::set:当尝试插入新元素时,set 会先检查该元素是否已经存在。如果已存在,那么插入操作会被忽略。
  • std::multiset:插入新元素时,无论该元素是否已存在,都会添加新元素。

在实践中,应根据实际需求选择使用 set 还是 multiset。如果需要确保集合中的元素唯一,则使用 set;如果需要允许集合中存在重复的元素,则使用 multiset

4.map和multimap的区别

std::mapstd::multimap 是 C++ 中的两种关联容器,它们都是基于红黑树实现,主要的区别在于键(key)的唯一性:

1.键的唯一性

  • std::mapmap 是一个键值对容器,其中每个键在容器中必须是唯一的,不允许有重复的键。也就是说,每个键只能对应一个唯一的值。
  • std::multimapmultimap 也是一个键值对容器,但它允许键可以有重复,也就是说,一个键可以对应多个值。

2.使用场景

  • std::map:适用于需要建立唯一键与值之间映射关系的情况。例如,可以用于存储学生的学号与姓名之间的映射。
  • std::multimap:适用于需要建立一个键对多个值的映射关系的情况。例如,可以用于存储同名学生的学号。

3.插入操作

  • std::map:在插入新的键值对时,如果键已经存在于容器中,则新的值会替换掉原有的值。
  • std::multimap:在插入新的键值对时,不论该键是否已经存在,新的键值对都会被添加到容器中。

4.访问元素

  • std::map:通过键来查找对应的值时,会找到第一个匹配的键值对。由于键是唯一的,因此只有一个值与该键匹配。
  • std::multimap:通过键来查找对应的值时,会找到所有匹配的键值对,因为一个键可以对应多个值。

在选择使用 map 还是 multimap 时,需要考虑键的唯一性。如果你需要建立唯一键与值之间的映射关系,使用 map。如果允许一个键对应多个值,使用 multimap