ACM程序设计(第2版)
上QQ阅读APP看书,第一时间看更新

2.5 multiset多重集合容器

multiset与set一样,也是使用红黑树来组织元素数据的,唯一不同的是,multiset允许重复的元素键值插入,而set则不允许。图2-4是multiset容器内部结构示意图。

图2-4 multiset容器内部结构示意图

multiset也需声明头文件包含“#include <set>”,由于它包含重复元素,所以,在插入元素、删除元素、查找元素上较set有差别。

2.5.1 multiset元素的插入

下面这个程序插入了重复键值“123”,最后中序遍历了multiset对象。

        #include <set>
        #include <string>
        #include <iostream>
        using namespace std;

       int main(int argc, char * argv[])
        {
          //定义元素类型为string的多重集合对象s,当前没有任何元素
          multiset<string> ms;
          ms.insert("abc");
          ms.insert("123");
          ms.insert("111");
          ms.insert("aaa");
          ms.insert("123");
          multiset<string>::iterator it;
          for(it=ms.begin(); it! =ms.end(); it++)
          {

                cout<<*it<<endl;
            }
            return 0;
          }

运行结果:

        111
        123
        123
        aaa
        abc

2.5.2 multiset元素的删除

采用erase()方法可以删除multiset对象中的某个迭代器位置上的元素、某段迭代器区间中的元素、键值等于某个值的所有重复元素,并返回删除元素的个数。采用clear()方法可以清空元素。

下面这个程序详细说明了insert()方法的使用方法。

        #include <set>
        #include <string>
        #include <iostream>
        using namespace std;

       int main(int argc, char * argv[])
        {
          //定义元素类型为string的多重集合对象s,当前没有任何元素
          multiset<string> ms;
          ms.insert("abc");
          ms.insert("123");
          ms.insert("111");
          ms.insert("aaa");
          ms.insert("123");
          multiset<string>::iterator it;
          for(it=ms.begin(); it! =ms.end(); it++)
          {
              cout<<*it<<endl;
          }
          //删除值为“123”的所有重复元素,返回删除元素总数2
          int n=ms.erase("123");
          cout<<"Total deleted : "<<n<<endl;
          //输出删除后的剩余元素
          cout<<"all elements after deleted :"<<endl;
          for(it=ms.begin(); it! =ms.end(); it++)
          {
              cout<<*it<<endl;
          }
          return 0;
        }

运行结果:

        111
        123
        123
        aaa
        abc
        Total deleted : 2
        all elements after deleted :
        111
        aaa
        abc

2.5.3 查找元素

使用find()方法查找元素,如果找到,则返回该元素的迭代器位置(如果该元素存在重复,则返回第一个元素重复元素的迭代器位置);如果没有找到,则返回end()迭代器位置。

下面的程序具体说明了find()方法的作用方法。

        #include <set>
        #include <string>
        #include <iostream>
        using namespace std;

       int main(int argc, char * argv[])
        {
          //定义元素类型为string的多重集合对象s,当前没有任何元素
          multiset<string> ms;
          ms.insert("abc");
          ms.insert("123");
          ms.insert("111");
          ms.insert("aaa");
          ms.insert("123");
          multiset<string>::iterator it;
          //查找键值“123”
          it=ms.find("123");
          if(it! =ms.end())//找到
          {
              cout<<*it<<endl;
          }
          else//没有找到
          {
              cout<<"not find it"<<endl;
          }
          it=ms.find("bbb");
          if(it! =ms.end())//找到
          {
              cout<<*it<<endl;
          }

            else//没有找到
            {
                cout<<"not find it"<<endl;
            }
            return 0;
          }

运行结果:

        123
        not find it