set--自动排序的STL

目录

set

用法

自定义比较方式

unordered_set

实例


set

set 是关联容器,含有键值类型对象的已排序集,搜索、移除和插入拥有对数复杂度。set 内部通常采用 红黑树 实现。平衡二叉树 的特性使得 set 非常适合处理需要同时兼顾查找、插入与删除的情况。

和数学中的集合相似,set 中不会出现值相同的元素。如果需要有相同元素的集合,需要使用 multisetmultiset 的使用方法与 set 的使用方法基本相同。

所以, multiset支持重复元素并排序。

用法

  • insert(x) 当容器中没有等价元素的时候,将元素 x 插入到 set 中。
  • erase(x) 删除值为 x 的 所有 元素,返回删除元素的个数。
  • erase(pos) 删除迭代器为 pos 的元素,要求迭代器必须合法。
  • erase(first,last) 删除迭代器在  范围内的所有元素。
  • clear() 清空 set

自定义比较方式

set 在默认情况下的比较函数为。然而在某些特殊情况下,我们希望能自定义 set 内部的比较方式。

这时候可以通过传入自定义比较器来解决问题。

具体来说,我们需要定义一个类,并在这个类中重载运算符。

例如,我们想要维护一个存储整数,且较大值靠前的 set,可以这样实现:

unordered_set

又有人问了

我不想让他排序怎么办?

直接重载成空气得了

这时,unordered_set来了!!!

自 C++11 标准起,四种基于哈希实现的无序关联式容器正式纳入了 C++ 的标准模板库中,分别是:unordered_setunordered_multisetunordered_mapunordered_multimap

unordered_set它可以去重,至于unordered_multiset它没啥用

Tips
在 C++11 之前,无序关联式容器属于 C++ 的 TR1 扩展。所以,如果编译器不支持 C++11,在使用时需要在头文件的名称中加入 tr1/ 前缀,并且使用 std::tr1 命名空间。如 #include <unordered_map> 需要改成 #include <tr1/unordered_map>std::unordered_map 需要改为 std::tr1::unordered_map(如果使用 using namespace std;,则为 tr1::unordered_map)。

 (用法同上)

实例

#include <bits/stdc++.h>
using namespace std;
int main()
{
    //排序
    //输入数字
    int n;
    cin >> n;
    //定义multiset
    multiset<int> A;
    int s;
    //输入
    for (int i = 0;i < n; i++)
        cin >> s, A.insert(s);
    //已排序,输出
    for (int i : A)
        cout << i << " ";
    return 0;
}
#include <bits/stdc++.h>
using namespace std;
int main()
{
    // 声明一个整型 set 容器
    set<int> mySet;

    // 插入元素
    mySet.insert(10);
    mySet.insert(20);
    mySet.insert(30);
    mySet.insert(40);

    // 输出 set 中的元素
    cout << "Set contains: ";
    for (int num : mySet)
        cout << num << " ";
    cout << std::endl;

    // 查找元素
    if (mySet.find(20) != mySet.end())  
        cout << "20 is in the set." << std::endl;
    else 
        cout << "20 is not in the set." << std::endl;
    // 删除元素
    mySet.erase(20);

    // 再次输出 set 中的元素
    cout << "After erasing 20, set contains: ";
    for (int num : mySet)
        cout << num << " ";
    cout << endl;

    // 检查 set 是否为空
    if (mySet.empty())
        cout << "The set is empty." << endl;
    else
        cout << "The set is not empty." << endl;

    // 输出 set 中元素的数量
    cout << "The set contains " << mySet.size() << " elements." << endl;

    return 0;
}

好了,所有都讲完了。

喜欢就点个关注吧!qwq

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值