set、unordered_set、multiset是什么?以及它们之间的区别
首先,它们三个都是C++标准库提供的关联容器中的一种。只不过set、multiset容器是有序的,而unordered_set容器是无序的
-
std::set 是 C++ 标准库中的一个容器,其存储的元素按设定的顺序排列。它使用平衡二叉树实现,允许通过元素值直接访问元素。它还提供 log(n) 的快速搜索时间。
-
std::unordered_set 是一个关联容器,其存储的元素没有特定的顺序,可以通过元素的值来访问。它使用散列表实现,提供更好的访问性能。
-
std::multiset 与 std::set 类似,但是它允许重复。它不会尝试保持自己的数据排序,而是依赖哈希表决定具体元素所在的位置。
使用set
C++中的Sets可以用作实施与算法相关的问题的有效工具。 它们有助于搜索,排序,删除和插入元素等活动。 这包括通过另一个值替换现有值,查找最小或最大元素等任务。
由于其平衡的树结构,集合结构的时间复杂度总是至少为O(log n),因此在处理频繁更新的数据集时,这将是最佳选择。
使用unordered_set
C++中的无序sets利用哈希表结构存储和组织元素。 它不保证排序,但仍可以使用集合中的某些操作,例如插入和删除元素,以常量时间搜索元素以及查找两个元素是否相等。
使用无序集时,由于不能保证存储元素的排序,无法使用与sets相关的任何需要排序的操作。
在做leetcode上面的算法题时,如果不需要维持元素中的顺序,使用unordered_set这种数据结构比set这种数据结构耗时要少。
使用multiset
Multisets是允许存储重复元素的容器。 当解决元素出现频率很重要的问题时可以使用它,例如频率分析。 在许多情况下,它可以提供额外的功能; 例如添加节点的发生率并更新发生率。
通常可以使用来自set和unordered_set的所有操作,以及特定的multiset操作,例如以其关联频率删除元素的能力。
set、unordered、multiset之间的通用操作。
因为他们都是属于C++中的关联容器,所以说他们都可以执行一些同样的操作,且函数名也是一样的。
插入操作
c.insert(v) // 插入一个元素,v是对应容器类型的一个元素。
c.insert(b,e) // b和e是一对迭代器,表示一个范围,将这个范围内的所有元素添加到容器中。区间是左闭右开
c.insert(il) // 其中il是一个列表,将列表中的元素全部都添加进容器中,如果是不允许重复的容器,则只添加没有添加过的元素。
删除操作
c.erase(k) // 从c中删除每个关键字为k的元素。返回一个size_type值,指出删除元素的数量。
访问操作
c.find(k); // 返回一个迭代器,指向第一个关键字为k的元素,若k不在容器中,则返回尾后迭代器。
c.count(k); //返回关键字等于k的元素的数量。对于不允许重复关键字的容器,返回值永远是0或1。
在不需要计数的情况,查找一个元素,最好是用find(),如果还需要统计元素的数量,这个时候再去考虑用count()