communist
2018-06-16 17:32:50
转载请注明出处,部分内容引自李煜东《算法竞赛进阶指南》
#include<set>
像这样:
set<类型>名称;
比如:
set<int>s;
set<vector<int> >s; //vector中提供重载<
set<set<int> >s; //平衡树嵌套,哈哈
multiset<double>s;
就像其他需要排序的数据类型一样,为一个结构体的
struct node{
......;
};
set<node>s;
bool operator <(const node &ai,const node &bi)
{
return ai.x>bi.x;
}
统计
用法:名称.size();
eg.
int num=s.size();
检查
用法:名称.empty();
eg.
if(s.empty())
cout<<"Myset is Empty."<<endl;
清空
用法:名称.clear();
eg.
s.clear();
返回
用法:名称.count(x)
eg.
if(!s.count(x))
ans++;
引用和操作:
set<类型>::iterator it;
eg.
set<int>::iterator it=s.begin();
it++;
it--;
若把
“++”,“--”操作的复杂度均为
//set
for(set<int>::iterator it=s.begin();it!=s.end();it++)
cout<<*it<<endl; //取出这个迭代器指向的元素
//set嵌套
for(set<set<int> >::iterator it=s.begin();it!=s.end();it++)
{
//首先取出set中嵌套的set
for(set<int>::iterator rit=(*it).begin();rit!=(*it).end();rit++)
cout<<*rit<<' '; //遍历这个set
cout<<endl;
}
返回集合的首迭代器,即指向集合中最小元素的迭代器,时间复杂度为
用法:名称.begin();
eg.
set<int>::iterator it=s.begin();
返回集合的尾迭代器,众所周知,STL中区间都是左闭右开的,那么
用法:名称.end();
eg.
maxn=*(--s.end()); //取出最大元素
在
PS:
用法:名称.insert(set类型);
eg.
s.insert(3);
删除,参数可以是元素或者迭代器,返回下一个元素的迭代器,时间复杂度为
用法:名称.erase(参数);
eg.
set<int>::iterator it=s.begin();
s.erase(it);
s.erase(3);
在
用法:名称.find(x);
eg.
if(s.find(x)!=s.end())
cout<<"Have Found!"<<endl;
两个神奇的东西,决定把他们放在一块谈一谈
用法与