关系式容器:
map的简单用法
1.头文件<map>
2.map查找时间复杂度是O(log2 n)。用它实现键到值的映射较快,原因是它用平衡二叉搜索树来存储和访问的。map一对一映射,基于关键字的快速查找,不允许有重复值。
3.map<string,int>stu;//定义;string为关键字,int为值//关键字不能重复
Stu[“tom”]=12;//赋值
4.例题:
题意:n个玩家给自己起游戏名
输入:n
接下来n行是名字
输出:如若没重复输出“OK”,有重复则在名字后面+1、2、3...
#include<map>
int main()
{
int n;
cin>>n;
map<string,int>mymap;
string s;
for(int i=0;i<n;i++)
{
cin>>s;
if(mymap[s]==0)
{
cout<<"OK"<<endl;
}
else
{
cout<<s<<mymap[s]<<endl;
}
mymap[s]++;
}
return 0;
}
关于set简单用法:
1.头文件<set>
2.set适用于二叉搜索树的实现,集合中的每个元素只出现一次,而且是排序好的。访问元素的时间复杂度是O(long2 n)。
3.set的相关操作:
set<type>A;//定义
A.insert<i>;//将i放入set
A.erase(i);//删除元素i
A.clear();//清空set
A.empty();//判断set是否为空,空返回true,否则返回false
A.size();//返回元素个数
A.find(k);//返回一个迭代器,指向键值k
A.lower_bound(k);//返回一个迭代器,指向键值不小于k的第一个元素_ _k_
A.upper_bound(k);// 返回一个迭代器,指向键值大于k的第一个元素_k_ _
3.例题:杭电OJ-- 2094 产生冠军
输入: 输出:
3 yes
Alice Bob
Smith John
Alice Smith
思路:被打败过的人一定不能当冠军!定义集合A、B,把所有人放进集合A,再把有失败记录的人放进B,如果A-B=1,则能产生冠军,否者则不行。
代码:
int main()
{
set<string>a,b;
string s1,s2;
int n;
while(cin>>n&&n)
{
for(int i=0;i<n;i++)
{
cin>>s1>>s2;
a.insert(s1);//a存所有的人
a.insert(s2);
b.insert(s2);//b存有失败记录的人
}
if(a.size()-b.size()==1) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
a.clear();
b.clear();
}
return 0;
}