C++ set、unordered_set、multiset它们之间的区别与一些使用方法(不断更新)

C++的set、unordered_set和multiset是关联容器。set和multiset基于平衡二叉树,前者不允许重复元素,后者允许。unordered_set使用哈希表,提供更快的查找速度但不保证顺序。multiset允许存储重复元素,适合频率分析。插入、删除和查找是它们共有的操作,但性能和特性因数据结构不同而异。
摘要由CSDN通过智能技术生成

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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿宋同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值