基本知识
set 翻译为集合,是一个内部自动有序且不含重复元素的容器。set 最主要的作用就是自动去重并按升序排序,因此遇到需要去重但是又不方便直接开数组的情况。set 中的元素是唯一的,其内部采用“红黑树”实现。
定义方式:set<类型>name;
c++set方法总结:
1、insert…插入一个元素,插入相同的元素的无效的
2、erase…删除某个元素
第一种删除
s.erase(s.begin());
第二种删除
first = s.begin();
second = s.begin();
second++; second++;
s.erase(first,second);
第三种删除
s.erase(18);
3、count…判断是否再set中
4、clear…清空set
5、size…获取元素的个数
lower_bound(key_value) ,返回第一个大于等于key_value的定位器
upper_bound(key_value),返回第一个大于key_value的定位器
迭代器的使用
set只能通过迭代器访问。即先定义一个迭代器:
set<类型>::iterator it;然后使用“*it”来访问set中的元素。
for(it = s.begin() ; it != s.end() ; it++)
{
cout<<*it<<" ";
}
对于一个set map等等:下标最末尾是rend,末尾后一个是end
例题
#include <bits/stdc++.h>
using namespace std;
set<int>vis;
int main()
{
int n;
while(cin>>n)
{
vis.clear();
for(int i=0;i<n;i++)
{
int x;
cin>>x;
vis.insert(x);
}
int res;
res=vis.size();
cout<<res<<endl;
set<int>::iterator it;
for(it=vis.begin();it!=vis.end();it++)
{
if(it==vis.begin())
cout<<*it;
else
cout<<" "<<*it;
}
cout<<endl;
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
set<int>vis;
int main()
{
int n,k;
cin>>n>>k;
for(int i=0; i<n; i++)
{
int x;
cin>>x;
vis.insert(x);
}
int t=0;
int f=0;
set<int>::iterator it;
for(it=vis.begin(); it!=vis.end(); it++)
{
t++;
if(t==k)
{
cout<<*it<<endl;
f=1;
break;
}
}
if(f==0)
cout<<"NO RESULT";
return 0;
}
#include <bits/stdc++.h>
using namespace std;
set<string>vis;
int main()
{
int n;
cin>>n;
while(n--)
{
int x;
string y;
cin>>x>>y;
if(x==0)
vis.insert(y);
if(x==1)
{
if(vis.count(y)==1)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
set<int>vis;
set<int>::iterator it;//访问set需要迭代器
int res=1;
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
int x;
cin>>x;
if(vis.size()==0)
vis.insert(x);
else
{
it=vis.upper_bound(x);//it是set容器中第一个大于x的迭代器
if(it==vis.end())//it>set中所有的数时需要增加一个铁轨
{
res++;
vis.insert(x);
}
else
{
vis.erase(*it);//x放到去掉的*it的那一根铁轨后面
vis.insert(x);
}
}
}
cout<<res<<endl;
return 0;
}