ACM程序设计(第2版)
上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