set集合是c++ STL库中自带的一个容器,set具有以下两个特点:
1、set中的元素都是排好序的
2、set集合中没有重复的元素
set的特性是所有元素都会根据元素的键值自动排序,set的元素不像map那样可以同时拥有实值(value)和键值(key),set元素的键值就是实值,实值就是键值。set不允许两个元素有相同的键值。
set的各成员函数列表:
1. begin()–返回指向第一个元素的迭代器
2. clear()–清除所有元素
3. count()–返回某个值元素的个数
4. empty()–如果集合为空,返回true
5. end()–返回指向最后一个元素的迭代器
6. equal_range()–返回集合中与给定值相等的上下限的两个迭代器
7. erase()–删除集合中的元素
8. find()–返回一个指向被查找到元素的迭代器
9. get_allocator()–返回集合的分配器
10. insert()–在集合中插入元素
11. lower_bound()–返回指向大于(或等于)某值的第一个元素的迭代器
12. key_comp()–返回一个用于元素间值比较的函数
13. max_size()–返回集合能容纳的元素的最大限值
14. rbegin()–返回指向集合中最后一个元素的反向迭代器
15. rend()–返回指向集合中第一个元素的反向迭代器
16. size()–集合中元素的数目
17. swap()–交换两个集合变量
18. upper_bound()–返回大于某个值元素的迭代器
19. value_comp()–返回一个用于比较元素间的值的函数
#include<set>
#include<iostream>
using namespace std;
int main()
{
set<int>s;
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
s.insert (x);
}
set<int>::iterator it;
for(it=s.begin ();it!=s.end ();it++)
{
printf("%d\n",*it);
}
//s.end()没有值
cout<<"s.begain() "<<*s.begin ()<<endl;
//lower_bound()--返回指向大于(或等于)某值的第一个元素的迭代器
cout<<"lower_buond 3 "<<*s.lower_bound (3)<<endl;
//upper_bound()--返回大于某个值元素的迭代器
cout<<"upper_bound 3 "<<*s.upper_bound (3)<<endl;
//find()--返回一个指向被查找到元素的迭代器
cout<<"find() 3 "<<*s.find (3)<<endl;
cout<<"s.size() "<<s.size ()<<endl;
return 0;
}
set t ------ 定义一个int类型的容器,(默认)里面元素从小到大
set<int, greater > t ------ 定义一个int类型的容器,里面元素从大到小
想遍历set里的元素或进行进一步修改,必须定义对应迭代器,以下三种定义方法(迭代器类似于指针)
set::iterator it ------ 定义正向迭代器
set::reverse_iterator rit; ------ 定义反向迭代器
auto it = t.begin(); ------ 因t.begin()返回正向迭代器,所以it自动被定义为正向迭代器,可适应其他所有操作
t.begin() ------ 返回set中第一个元素,类型为正向迭代器
t.rbegin() ------ 返回set中最后一个元素,类型为反向迭代器
t.end() ------ 返回set中最后一个元素,类型为正向迭代器
t.rend() ------ 返回set中第一个元素,类型为反向迭代器
t.find(k) ------ 寻找k,若找到返回对应的迭代器,否则返回end();
t.insert(a, b) ------ 插入指针[a, b)之间的元素,已有元素不会再次插入
t.erase(it) ------ 删除迭代器it对应的元素
t.erase(l, r) ------ 删除迭代器[l, r)之间的元素
lower_bound(k) ------ 返回第一个大于等于k的元素的迭代器
upper_bound(k) ------ 返回第一个大于k的元素的迭代器