set资料参考
set特点如下:
1、都是排好序的
2、没有重复的元素
3.在set中查找是使用二分查找,每次排序、插入、删除都是O(logn)(以2为底)的复杂度。但是与map容器不同,set容器不支持下标操作访问元素
4.判断set是否插入成功方法
set的带有一个键参数的insert版本函数返回pair类型对象,该对象包含一个迭代器和一个bool值,迭代器指向拥有该键的元素,而bool值表明是否添加了元素
map相关参考
2.3 缺席考试的是谁?
#include<iostream>
#include<set>
using namespace std;
int main()
{
int n;
while(cin>>n&&n)
{
set<string> student;
for(int i=0;i<2*n-1;i++)
{
string s;cin>>s;
if(student.insert(s).second==false)
student.erase(s);
}
cout<<*student.begin()<<endl;
}
}
2.4 电话号码
#include<iostream>
#include<map>
#include<set>
#include<vector>
#include<algorithm>
using namespace std;
bool cmp(string x,string y)
{
if(x.length()!=y.length()) return x.length()<y.length();
return x<y;
}
int main()
{
map<string,set<string> > directory;
int n;cin>>n;
while(n--)
{
string name;int num;
cin>>name>>num;
for(int i=0;i<num;i++)
{
string s;cin>>s;
directory[name].insert(s);
}
}
cout<<directory.size()<<endl;
for(map<string,set<string> >::iterator it=directory.begin();it!=directory.end();++it)
{
vector<string> number;
for(set<string>::iterator iter1=it->second.begin();iter1!=it->second.end();++iter1)
{
int flag=1;
for(set<string>::iterator iter2=it->second.begin();iter2!=it->second.end();++iter2)
{
int a=(*iter1).length(),b=(*iter2).length();
if(a>=b) continue;
string temp;
if(a<b) temp=(*iter2).substr(b-a);//temp为s2子串,存在s1是s2后缀的可能
if(temp==(*iter1)) flag=0;//s1是后缀,不计入
}
if(flag==1) number.push_back(*iter1);
}
sort(number.begin(),number.end(),cmp);
cout<<it->first<<" "<<number.size();
for(int i=0;i<(int)number.size();i++)
cout<<" "<<number[i];
cout<<endl;
}
}