标签:c++ stl c++ primer 标准模板库
C++ Primer(第五版)学习笔记_9_标准模板库_multimap多重映照容器
多重映照容器multimap与map结构基本相同,但由于重复键值存在,所以multimap的元素插入、删除、查找都与map的方法不相同。
1、multimap对象创建、元素插入
插入元素时,需要使用insert()方法和类似pair<string,double>(“Jack”, 300.5)的元素结构。可以看到,重复的元素是按照插入的先后顺序排序的。
#include <iostream>
#include <stdio.h>
#include <string>
#include <map>
using namespace std;
int main()
{
multimap<string, double> str;
//插入元素
str.insert(pair<string, double>("Jack", 400));
str.insert(pair<string, double>("Kity", 200));
str.insert(pair<string, double>("Jack", 300.5));
str.insert(pair<string, double>("Memi", 500));
str.insert(pair<string, double>("Jack", 306));
for(multimap<string, double>::iterator iter = str.begin(); iter !=str.end(); iter++)
cout << (*iter).first << " : " <<(*iter).second << endl;
return 0;
}运行结果:
Jack : 400
Jack : 300.5
Jack : 306
Kity : 200
Memi : 500
2、元素的删除:erase()和clear()
删除某个键值采用erase()方法,当有重复的键值,会一次性都删除。使用clear()方法可将multimap容器中的元素清空。
#include <iostream>
#include <stdio.h>
#include <string>
#include <map>
using namespace std;
int main()
{
multimap<string, double> str;
//插入元素
str.insert(pair<string, double>("Jack", 400));
str.insert(pair<string, double>("Kity", 200));
str.insert(pair<string, double>("Jack", 300.5));
str.insert(pair<string, double>("Memi", 500));
str.insert(pair<string, double>("Jack", 306));
for(multimap<string, double>::iterator iter = str.begin(); iter !=str.end(); iter++)
cout << (*iter).first<< ": "<< (*iter).second << endl;
//删除Jack
int n = str.erase("Jack");
cout << "删除元素个数: " << n <<endl;
cout << "删除后的元素: " << endl;
for(multimap<string, double>::iterator iter = str.begin(); iter !=str.end(); iter++)
cout << (*iter).first<< ": "<< (*iter).second << endl;
//清空
str.clear();
if(str.size() == 0)
cout << "元素为空" << endl;
else
cout << "元素个数为:" << endl;
return 0;
}运行结果:
Jack : 400
Jack : 300.5
Jack : 306
Kity : 200
Memi : 500
删除元素个数:3
删除后的元素:
Kity : 200
Memi : 500
元素为空
3、元素的查找
由于multimap存在重复的键值,所以find()方法只返回第一个元素的迭代器位置。如果没有找到该键值,则返回end()迭代器位置。
#include <iostream>
#include <stdio.h>
#include <string>
#include <map>
using namespace std;
int main()
{
multimap<string, double> str;
//插入元素
str.insert(pair<string, double>("Jack", 400));
str.insert(pair<string, double>("Kity", 200));
str.insert(pair<string, double>("Jack", 300.5));
str.insert(pair<string, double>("Memi", 500));
str.insert(pair<string, double>("Jack", 306));
for(multimap<string, double>::iterator iter = str.begin(); iter !=str.end(); iter++)
cout << (*iter).first << " : " <<(*iter).second << endl;
//查找键值
cout << "找到的结果: ";
multimap<string, double>::iterator iter;
iter = str.find("Jack");
if(iter != str.end())
cout << (*iter).first << " : " <<(*iter).second << endl;
else
cout << "没有找到结果" << endl;
cout << "找到的结果: ";
iter = str.find("Nacy");
if(iter != str.end())
cout << (*iter).first << " : " <<(*iter).second << endl;
else
cout << "没有找到结果" << endl;
return 0;
}
运行结果:
Jack : 400
Jack : 300.5
Jack : 306
Kity : 200
Memi : 500
找到的结果:Jack :400
找到的结果:没有找到结果
4、自定义比较函数
默认情况下,按照键值由小到大的顺序插入元素。由于内部数据结构都是红黑树,因此编写比较函数与map是一致的。编写方法有两种,
(1)如果元素不是结构体,那么可以编写比较函数。下面实现键值由大到小的顺序将元素插入mutlmap中:
#include <iostream>
#include <stdio.h>
#include <string>
#include <map>
using namespace std;
struct myComp
{
bool operator()(string a, string b)
{
return a > b;
}
};
int main()
{
multimap<string, double, myComp> str;
//插入元素
str.insert(pair<string, double>("Jack", 400));
str.insert(pair<string, double>("Kity", 200));
str.insert(pair<string, double>("Jack", 300.5));
str.insert(pair<string, double>("Memi", 500));
str.insert(pair<string, double>("Jack", 306));
for(multimap<string, double, myComp>::iterator iter = str.begin(); iter !=str.end(); iter++)
cout << (*iter).first<< ": "<< (*iter).second << endl;
return 0;
}运行结果:
Memi : 500
Kity : 200
Jack : 400
Jack : 300.5
Jack : 306
(2)如果元素是结构体,那么,可以直接把比较函数写在结构体里面。
#include <iostream>
#include <stdio.h>
#include <string>
#include <map>
using namespace std;
struct Info
{
string name;
float score;
bool operator < (Info a) const
{
return a.score < score;
}
};
int main()
{
multimap<Info, double> str;
//插入元素
Info info;
info.name = "Jack";
info.score = 60;
str.insert(pair<Info, double>(info, 400));
info.name = "Bomi";
info.score = 80;
str.insert(pair<Info, double>(info, 200));
info.name = "Peti";
info.score = 80;
str.insert(pair<Info, double>(info, 300.5));
info.name = "Kity";
info.score = 70;
str.insert(pair<Info, double>(info, 500));
for(multimap<Info, double>::iterator iter = str.begin(); iter !=str.end(); iter++)
{
cout << (*iter).second<< ": ";
cout <<((*iter).first).name << " " << ((*iter).first).score << endl;
}
return 0;
}
运行结果:
200 : Bomi 80
300.5 : Peti 80
500 : Kity 70
400 : Jack 60
版权声明:本文为博主原创文章,未经博主允许不得转载。
C++ Primer(第五版)学习笔记_9_标准模板库_multimap多重映照容器
标签:c++ stl c++ primer 标准模板库
原文地址:http://blog.csdn.net/keyyuanxin/article/details/46908267