上QQ阅读APP看书,第一时间看更新
2.7 multimap多重映照容器
multimap与map基本相同,唯独不同的是,multimap允许插入重复键值的元素。由于允许重复键值存在,所以,multimap的元素插入、删除、查找都与map不相同。
要使用multimap,则需要头文件包含语句“#include <map>”。map文件在C:\Program Files\Microsoft Visual Studio\VC98\Include文件夹中。
2.7.1 multimap对象创建、元素插入
可以重复插入元素,插入元素需要使用insert()方法。下面这个程序,重复插入了一个名为“Jack”的键值。
#pragma warning(disable:4786) #include <map> #include <string> #include <iostream> using namespace std; int main(int argc, char * argv[]) { //定义map对象,当前没有任何元素 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; } return 0; }
运行结果:
Jack : 300.5 Jack : 306 Kity : 200 Memi : 500
2.7.2 元素的删除
删除操作采用erase()方法,可删除某个迭代器位置上的元素、等于某个键值的所有重复元素、一个迭代器区间上的元素。使用clear()方法可将multimap容器中的元素清空。
因为有重复的键值,所以,删除操作会将要删除的键值一次性从multimap中删除。下面这个程序说明了这点。
#pragma warning(disable:4786) #include <map> #include <string> #include <iostream> using namespace std; int main(int argc, char * argv[]) { //定义map对象,当前没有任何元素 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; } //删除键值等于“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; }
运行结果:
Jack : 300.5 Jack : 306 Kity : 200 Memi : 500 the elements after deleted: Kity : 200 Memi : 500
2.7.3 元素的查找
由于multimap存在重复的键值,所以find()方法只返回重复键值中的第一个元素的迭代器位置,如果没有找到该键值,则返回end()迭代器位置。下面这个程序说明了这一点。
#pragma warning(disable:4786) #include <map> #include <string> #include <iostream> using namespace std; int main(int argc, char * argv[]) { //定义map对象,当前没有任何元素 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; cout<<"all of the elements:"<<endl; 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; } return 0; }
运行结果:
all of the elements: Jack : 300.5 Jack : 306 Kity : 200 Memi : 500 the searching result: Jack 300.5 not find it