set容器详解

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

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

插入与删除操作

insert(x) 当容器中没有等价元素的时候,将元素 x 插入到 set 中。

erase(x) 删除值为 x 的 所有 元素,返回删除元素的个数。

erase(pos) 删除迭代器为 pos 的元素,要求迭代器必须合法。

erase(first,last) 删除迭代器在  范围内的所有元素。

clear() 清空 set。

查找操作

count(x) 返回 set 内键为 x 的元素数量。

find(x) 在 set 内存在键为 x 的元素时会返回该元素的迭代器,否则返回 end()。

lower_bound(x) 返回指向首个不小于给定键的元素的迭代器。如果不存在这样的元素,返回 end()。

upper_bound(x) 返回指向首个大于给定键的元素的迭代器。如果不存在这样的元素,返回 end()。

empty() 返回容器是否为空。

size() 返回容器内元素个数。

#include<iostream>//set容器
#include<set> //set头文件
using namespace std;
void solve()
{
    int n;
    cin >> n;
    set<int> q;
    while (n--)
    {
        int m;
        cin >> m;
        bool op = 1;
        for (int i = 0, a; i < m; i++)
        {
            cin >> a;
            if (op)
            {
                cout << a;
                q.insert(a); //将元素a插入set容器
                op = 0;
            }
            else
            {
                if (q.find(a) == q.end()) //q.find()查找元素  q.end()尾端元素
                {
                    cout << " " << a;
                }
                q.insert(a); 
            }
        }
        cout << "\n";
    }

}
int main()
{
    solve();
    return 0;
}
#include<iostream>
#include<vector>
#include<set>
using namespace std;
int main()
{
    vector<int> myVector = { 1,2,3,4,58 };

    cout << myVector[0] << endl;
    myVector.push_back(6);
    cout << myVector[5] << endl;
}
void solve()
{
    int n, k;
    cin >> n >> k;
    set<int> q;
    for (int i = 0,a; i < n; i++)
    {
        cin >> a;  q.insert(a);
    }
    int res = 0;
    for (auto x : q) //auto迭代器
    {
        res++;
        if (res == k)
        {
            cout << x << endl;
            return;
        }
    }
    cout << "no answer\n";
}
int main()
{
    solve();
    return 0;
}

  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值