set 1.无重复元素 2.自动排序 3.和map不同 只有值没有键
#include <stdio.h>
#include <set>
#include<iostream>
using namespace std;
void solve(set<int> s1,set<int> s2,set<int> &s3)
{
set<int>::iterator it1;
set<int>::iterator it2;
it1=s1.begin();
it2=s2.begin();
while(it1!=s1.end()&&it2!=s2.end()){
if(*it1==*it2) {
s3.insert(*it1);
it1++;
it2++;
}
else if(*it1<*it2) it1++;
else it2++;
}
}
void dispset(set<int> s)
{
if (s.empty())
{
printf("None\n");
return;
}
set<int>::iterator it=s.begin();
printf("%d",*it);
for (++it;it!=s.end();++it)
printf(" %d",*it);
printf("\n");
}
int main()
{
int n, m, a[105], b[105];
while (scanf("%d", &n) != EOF)
{
for (int i = 0; i < n; i ++)
scanf("%d", &a[i]);
scanf("%d", &m);
for (int i = 0; i < m; i ++)
scanf("%d", &b[i]);
set<int> s1(a,a+n);
set<int> s2(b,b+m);
set<int> s3;
solve(s1,s2,s3);
dispset(s3);
}
return 0;
}
map是将关键字(key)和映射值(value)形成映射后绑定存储的容器,底层用红黑树实现,内部仍然有序,查找效率仍然为O(logn)
unordered_map底层用散列表实现,查找效率为O(1)
map一般就够用了。
map和set两种容器的底层结构都是红黑树,所以容器中不会出现相同的元素,因此count()的结果只能为0和1,可以以此来判断键值元素是否存在(当然也可以使用find()方法判断键值是否存在)。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
#include<map>
using namespace std;
map<string,int> myMap;//映射关键字 值类型
int main(){
//插入的两种方法
myMap["Emma"]=67;
myMap["Benedict"]=100;
myMap.insert(pair<string,int>("Bob",72));
myMap.insert(pair<string,int>("Mary",85));
myMap.insert(pair<string,int>("Alice",93));
//一些方法 erase clear size empty
myMap.erase("Benedict");
cout<<"size of the map "<<myMap.size()<<endl;
//遍历 用迭代器
map<string,int>::iterator it;//定义迭代器
for(it=myMap.begin();it!=myMap.end();it++){
cout<<"the score of "<<it->first;
cout<<":"<<it->second<<endl;
}
//迭代器+find方法
it=myMap.find("Bob");
if(it!=myMap.end()) cout<<"Bob is found"<<endl;
else cout<<"Bob is not found"<<endl;
}
映射 键和值的选择
子串计算 map自动排好序
得到所有子串
for(int i=1;i<=str.size();i++){
for(int j=0;j<i;j++){
string key=str.substr(j,i-j);
number[key]++;
}
}
题解 注意迭代器遍历
#include <iostream>
#include <vector>
#include <algorithm>
#include<cstring>
#include<queue>
#include<map>
using namespace std;
int main(){
string str;
while(cin>>str){
map<string,int> number;
for(int i=0;i<=str.size();i++){
for(int j=0;j<i;j++){
string key=str.substr(j,i-j);
number[key]++;
}
}
map<string,int>::iterator it;
for(it=number.begin();it!=number.end();++it){
if(it->second>1){
cout<<it->first<<" "<<it->second<<endl;
}
}
}
}
利用自动排序 同时注意如何访问最后一个键值对
#include <iostream>
#include <vector>
#include <algorithm>
#include<cstring>
#include<queue>
#include<map>
using namespace std;
int main(){
int n;
while(cin>>n){
map<string,string> in;
map<string,string> out;
while(n--){
string s1,s2,s3;
cin>>s1>>s2>>s3;
in[s2]=s1;
out[s3]=s1;
}
map<string,string>::iterator it;
it=in.begin(); cout<<it->second<<" ";
it=out.end(); it--; cout<<it->second;// 最后一个键值对!!!!!!!!!!!
}
}