一.关于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;
}