map映照容器
map也是用红黑树实现的,插入元素的键值不允许重复,比较函数针对键值比较。map函数
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
int main()
{
map<string, float> m;
m["jack"] = 98;
m["bomi"] = 96;
m["kate"] = 97;
map<string, float>::iterator it;
for (it = m.begin(); it != m.end(); it ++)
cout << (*it).first<<":"<<(*it).second<<endl;
return 0;
}
元素的增删查
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
int main()
{
map<int,char> m;
//插入元素,按键值的由小到大放入黑白树中
m[25]='m';
m[28]='k';
m[10]='x';
m[30]='a';
map<int,char>::iterator it;
for (it = m.begin(); it != m.end(); it ++)
cout << (*it).first<<":"<<(*it).second<<endl;
it = m.find(28);
if(it!=m.end())//搜索到该键值
cout<<(*it).first<<" : "<<(*it).second<<endl;
else
cout<<"not found it"<<endl;
//删除键值为 28 的元素
m.erase(28);
//反向遍历元素
map<int,char>::reverse_iterator rit;
for(rit = m.rbegin(); rit != m.rend(); rit ++)
cout<<(*rit).first<<" : "<<(*rit).second<<endl;
return 0;
}
自定义比较函数,与set一样的两种方式:
- 如果元素不是结构体,可以编写比较函数。按键值由大到小的顺序将元素插入到 map 中:
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
//自定义比较函数
struct cmp
{
bool operator()(const int &a,const int &b)
{
if(a!=b)
return a>b;
else
return a>b;
}
};
int main()
{
map<int, char, cmp> m;
m[25]='m';
m[28]='k';
m[10]='x';
m[30]='a';
map<int, char, cmp>::iterator it;
for(it = m.begin();it != m.end(); it ++)
cout<<(*it).first<<" : "<<(*it).second<<endl;
return 0;
}
- 如果元素是结构体,,直接把比较函数写在结构体内
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
struct Info
{
string name;
float score;
//重载“<”操作符,自定义排序规则
bool operator < (const Info &a) const
{
//按 score 由大到小排列。如果要由小到大排列,使用“>”号即可
return a.score < score;
}
};
int main()
{
map<Info,int> m;
Info info;
//插入元素,按键值的由小到大放入黑白树中
info.name = "Jack";
info.score = 60;
m[info] = 25;
info.name = "Bomi";
info.score = 80;
m[info] = 10;
info.name = "Peti";
info.score = 66.5;
m[info] = 30;
map<Info,int>::iterator it;
for(it=m.begin();it!=m.end();it++)
{
cout<<(*it).second<<" : ";
cout<<((*it).first).name<<" "<<((*it).first).score<<endl;
}
return 0;
}
用map实现数字分离
把数字当成字符串,使用 map 的映照功能,很方便地实现了数字分离。
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
int main()
{
map<int,char> m;
//字符映射数字
for(int j = 0; j < 10; j ++)
m['0' + j] = j;
string sa,sb;
sa="6234";
int i;
int sum=0;
for(i = 0; i <sa.length(); i ++)
{
sum += m[sa[i]];
}
cout<<"sum = "<<sum<<endl;
//数字映照字符
for(int j = 0;j < 10;j ++)
{
m[j]='0'+j;
}
int n = 7;
string s ="The number is ";
cout<<s + m[n]<<endl;
return 0;
}
=>
sum = 15
The number is 7
multimap多重映照容器
multimap允许插入重复键值元素。
multimap函数
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
int main()
{
multimap<string,double> m;
//插入元素
m.insert( pair<string,double>("Jack",300.5) );
m.insert( pair<string,double>("Kity",200) );
m.insert( pair<string,double>("Memi",500) );
//重复插入键值“Jack”
m.insert( pair<string,double>("Jack",306) );
//使用前向迭代器中序遍历 multimap
multimap<string,double>::iterator it;
for(it = m.begin(); it != m.end(); it ++)
{
cout<<(*it).first<<" : "<<(*it).second<<endl;
}
//查找键值
cout<<endl<<"the searching result:"<<endl;
it=m.find("Jack");
if(it!=m.end())//找到
{
cout<<(*it).first<<" "<<(*it).second<<endl;
}
else//没找到
{
cout<<"not find it"<<endl;
}
it=m.find("Nacy");
if(it!=m.end())//找到
{
cout<<(*it).first<<" "<<(*it).second<<endl;
}
else//没找到
{
cout<<"not find it"<<endl;
}
cout<<endl;
//删除键值等于“Jack”的元素
m.erase("Jack");
//使用前向迭代器中序遍历 multimap
cout<<"the elements after deleted:"<<endl;
for(it=m.begin();it!=m.end();it++)
{
cout<<(*it).first<<" : "<<(*it).second<<endl;
}
return 0;
}
网友评论