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;//删除Jackint 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;elsecout << "元素个数为:" << 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; elsecout << "没有找到结果" << endl;cout << "找到的结果: "; iter = str.find("Nacy"); if(iter != str.end())cout << (*iter).first << " : " <<(*iter).second << endl; elsecout << "没有找到结果" << endl; return 0;}
运行结果:
Jack : 400
Jack : 300.5
Jack : 306
Kity : 200
Memi : 500
找到的结果:Jack :400
找到的结果:没有找到结果
4、自定义比较函数
默认情况下,按照键值由小到大的顺序插入元素。由于内部数据结构都是红黑树,,因此编写比较函数与map是一致的。编写方法有两种,
(1)如果元素不是结构体,那么可以编写比较函数。下面实现键值由大到小的顺序将元素插入mutlmap中:
还深深埋在心底,要除去,怕是不能活命。