set
- set就是集合。STL的set用二叉搜索树实现,集合中的每个元素只出现一次,并且是排好序的,访问元素的时间复杂度是O(log2(n)),非常高效
- 在需要用二叉搜索树处理数据的题目,如果用set或map实现可以极大简化代码
set的相关操作
:
头文件:#include<set>
set<Type>A;//定义
A.insert(x);//把x放进set
A.erase(x);//删除元素x
A.clear();//清空set
A.empty();//判断是否为空
A.size();//返回元素个数
A.count();//返回某个元素的个数,集合中只能是1或0
A.find(k);//返回一个迭代器,指向键值k
A.lower_bound(k);//返回一个迭代器,指向键值不小于k的第一个元素
A.upper_bound();//返回一个迭代器,指向键值大于k的第一个元素
简单熟悉一下:
#include<iostream>
#include<set>
using namespace std;
int main()
{
set<int>A;
A.insert(1);
A.insert(2);
A.insert(2);
A.insert(3);
A.insert(5);
A.insert(9);
//因为集合中元素只出现一次
cout<<"元素个数:"<<A.size()<<endl;
cout<<"是否为空:"<<A.empty()<<endl;//否返回0
A.erase(1);
cout<<"删除后元素个数:"<<A.size()<<endl;
A.clear();
cout<<"输出0则已清空:"<<A.size();
}
举个例题来看一下:
解题思路:分别把所有人放进集合A,把失败者放进集合B,如果A-B=1,就可以判断存在冠军,否则不能。据集合的不重复特性,只要还剩一个人没失败过,那他就是冠军
#include<iostream>
#include<set>
using namespace std;
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.insert(s2);
B.insert(s2);
}
if(A.size() - B.size() == 1)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
A.clear();B.clear();
}
return 0;
}
map
一个常见的问题:有n个学生,已知他们的姓名name和学号id,现在给定一个学生的name,要求查找他的id。
我们一般用结构体存储信息,然后查找学生,输出id,复杂度O(n),效率很低。
利用STL中的map容器可以快速地实现这个查找,复杂度是O(log2(n))
map是关联容器,它实现从键到值得映射。map效率高得原因是它用平衡二叉搜索树来存储和访问。
打开
#include<map>
头文件
map的具体操作有:
(1)例如上面的例子可以这样定义:
map<string,int>student
(2)赋值:例如student[“Jodan”]=23,这里把“Jodan”当成普通数组的下标来使用
(3)查找:在找学号是,可以直接使用student[“Jodan”]表示他的id,不用再去搜索所有的姓名。
map的其他定义方式;
map<int ,string>int;
map<string,char>str;
map<char,int>char;等等
map的相关操作:
stu["Kobe"] = 24;//赋值
stu.insert(pair<string,int>("Bosh",1));//插入
stu.count("James");//找到返回1,没找到返回0
stu.size();//map的大小
stu.erase("Bosh");//删除
#include<iostream>
#include<map>
#include<string>
using namespace std;
int main()
{
map<string,int>stu;
stu["Kobe"] = 24;
stu["James"] = 23;
stu["Wade"] = 3;
stu.insert(pair<string,int>("Bosh",1));
cout<<"Bosh同学的id:"<<stu["Bosh"]<<endl;
cout<<"map的大小:"<<stu.size()<<endl;
cout<<"查找是否存在James:"<<stu.count("James")<<endl;
stu.erase("Bosh");
cout<<"删除后map大小:"<<stu.size()<<endl;
}