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
版权声明:本文为博主原创文章,未经博主允许不得转载。