C++中set用法

一.关于set

C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构操作。vector封装数组,list封装了链表,map和set封装了二叉树等,在封装这些数据结构的时候,STL按照程序员的使用习惯,以成员函数方式提供的常用操作,如:插入、排序、删除、查找等。让用户在STL使用过程中,并不会感到陌生。

二.特点

  • map和set的插入删除效率比用其他序列容器高
  • 每次insert之后,以前保存的iterator不会失效
  • 当数据元素增多时,set的插入和搜索速度变化不大(二分查找)

三.set中常用的方法

begin()        ,返回set容器的第一个元素
end()      ,返回set容器的最后一个元素
clear()          ,删除set容器中的所有的元素
empty()    ,判断set容器是否为空
max_size()   ,返回set容器可能包含的元素最大个数
size()      ,返回当前set容器中的元素个数
rbegin     ,返回的值和end()相同
rend()     ,返回的值和rbegin()相同

四.例题应用

乌龟与洞穴

Description

辽阔的太平洋上有一个十分美丽的岛。

岛的海岸上有 n 个洞穴呈环形分布(从逆时针编号0到n−1),有一只乌龟生活在岛上,它早上都会外出觅食,晚上都会回到岛上,然后寻找洞穴睡觉。但是,这只乌龟不会去寻找之前睡过的洞穴入睡,因此每天都需要消耗大量的时间去寻找洞穴。

现在给你 n 天晚上乌龟回来的洞穴位置,你能帮助它寻找每天入睡的洞穴吗?注意:乌龟只会沿逆时针寻找洞穴。

Input

第一行包含一个整数 T (1≤T≤1000)T (1≤T≤1000) 代表测试组数,对于每一组测试:

第一行一个整数 nn (1≤n≤105)(1≤n≤105) 表示洞穴的个数以及总共的天数 。

第二行 nn 个整数 aiai (0≤ai≤n−1)(0≤ai≤n−1)  表示第 ii 天回来的洞穴位置。

数据保证所有测试中 n的和不超过 10的6次方。

Output

对于每组测试,输出一行,包含 n 个整数,第 i个整数表示第 i天乌龟入睡的洞穴的编号。

输入

2
6
4 5 5 0 4 3
4
1 1 1 1

输出

4 5 0 1 2 3
1 2 3 0
#include<bits/stdc++.h>
 
using namespace std;
 
int main() {
    int T;
    scanf("%d", &T);
    while (T--) {
        set<int> s;
        int n;
        scanf("%d", &n);
        for (int i = 0; i < n; i++) {
            s.insert(i);
        }
        while (n--) {
            int x;
            scanf("%d", &x);
            //lower_bound()--返回指向大于(或等于)某值的第一个元素的迭代器
            auto it = s.lower_bound(x);
            //s.end()没有值
            if (it == s.end()) {
                it = s.begin();
            }
            printf("%d%c", *it, " \n"[n == 0]);
            s.erase(it);
        }
    }
    return 0;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值