码迷,mamicode.com
首页 > 编程语言 > 详细

C++ Primer(第五版)学习笔记_7_标准模板库_multiset多重集合容器

时间:2015-07-14 15:44:47      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:c++   stl   

C++ Primer(第五版)学习笔记_7_标准模板库_multiset多重集合容器

多重集合容器multiset与set一样,也是使用红黑树来组织元素数据的,唯一不用的是,multiset允许重复的元素键值插入。其结构示意图如下:

技术分享

1、multiset元素插入

#include <iostream>
#include <stdio.h>
#include <vector>
#include <set>
#include <string>
 
using namespace std;
 
int main()
{
   multiset<string> str;
 
   str.insert("abc");
   str.insert("123");
   str.insert("111");
   str.insert("aaa");
   str.insert("123");
 
   //中序遍历集合中所有的元素
   for(multiset<string>::iterator iter = str.begin(); iter!=str.end(); iter++)
       cout << *iter << " ";
   cout << endl;
    return 0;
}

运行结果:

111 123  123  aaa abc

 

2、multiset元素删除

(1)、采用erase()方法可以删除multiset对象中某个值所有重复的元素,并返回删除元素的个数。

(2)、采用clear()方法可以清空元素。

#include <iostream>
#include <stdio.h>
#include <vector>
#include <set>
#include <string>
 
using namespace std;
 
int main()
{
   multiset<string> str;
 
   str.insert("abc");
   str.insert("123");
   str.insert("111");
   str.insert("aaa");
   str.insert("123");
 
   //中序遍历集合中所有的元素
   for(multiset<string>::iterator iter = str.begin(); iter!=str.end(); iter++)
        cout << *iter << " ";
   cout << endl;
   cout << endl;
 
   int n = str.erase("123");
   cout << "删除元素的个数: " << n << endl;
   cout << "输出删除后剩余元素" << endl;
   for(multiset<string>::iterator iter = str.begin(); iter!=str.end(); iter++)
       cout << *iter << " ";
   cout << endl;
   cout << endl;
 
   str.clear();
   cout << "输出删除后剩余元素" << endl;
   for(multiset<string>::iterator iter = str.begin(); iter!=str.end(); iter++)
       cout << *iter << " ";
   cout << endl;
   return 0;
}

运行结果:

111 123  123  aaa abc

删除元素的个数: 2

输出删除后剩余元素

111 aaa  abc

输出删除后剩余元素

 

3、查找元素find()

使用find()方法查找元素:

如果找到,则返回该元素的迭代器位置(如果该元素存在重复,则返回第一个元素重复元素的迭代器位置);如果找到,则返回该元素的迭代器位置(如果该元素存在重复,则返回第一个元素重复元素的迭代器位置);

如果没有找到,则返回end()迭代器位置。

#include <iostream>
#include <stdio.h>
#include <vector>
#include <set>
#include <string>
 
using namespace std;
 
int main()
{
   multiset<string> str;
 
   str.insert("abc");
   str.insert("123");
   str.insert("111");
   str.insert("aaa");
   str.insert("123");
 
   //中序遍历集合中所有的元素
    for(multiset<string>::iterator iter =str.begin(); iter!= str.end(); iter++)
       cout << *iter << " ";
   cout << endl;
   cout << endl;
 
   multiset<string>::iterator iter;
   iter = str.find("123");
   if(iter != str.end()) //找到
       cout << *iter << endl;
   else  //没有找到
       cout << "没有找到" << endl;
   iter = str.find("bbb");
   if(iter != str.end())
       cout << *iter << endl;
   else
       cout << "没有找到" << endl;
   return 0;
}

运行结果:

111 123  123  aaa abc

123

没有找到


4、自定义比较函数

默认情况下,按照键值由小到大的顺序插入元素。由于内部数据结构都是红黑树,因此编写比较函数与set是一致的。编写方法有两种,

(1)如果元素不是结构体,那么可以编写比较函数。下面实现键值由大到小的顺序将元素插入mutlset中:

#include <iostream>
#include <stdio.h>
#include <vector>
#include <set>
#include <string>
 
using namespace std;
 
struct myComp
{
    bool operator()(string a, string b)
    {
       return a > b;
    }
};
 
 
int main()
{
    multiset<string, myComp> str;
 
    str.insert("abc");
    str.insert("123");
    str.insert("111");
    str.insert("aaa");
    str.insert("123");
 
    //中序遍历集合中所有的元素
    for(multiset<string, myComp>::iterator iter = str.begin(); iter!=str.end(); iter++)
        cout << *iter <<"";
    cout << endl;
    return 0;
}


运行结果:

abc aaa  123  123 111

 

(2)如果元素是结构体,那么,可以直接把比较函数写在结构体里面。

#include <iostream>
#include <stdio.h>
#include <vector>
#include <set>
#include <string>
 
using namespace std;
 
struct Info
{
  string name;
  float score;
  bool operator < (Info a) const
  {
    return a.score < score;
  }
};
 
 
int main()
{
    multiset<Info> str;
 
    //插入元素
    Info info;
    info.name = "Jack";
    info.score = 60;
    str.insert(info);
 
    info.name = "Bomi";
    info.score = 80;
    str.insert(info);
 
    info.name = "Peti";
    info.score = 80;
    str.insert(info);
 
    info.name = "Kity";
    info.score = 70;
    str.insert(info);
 
    for(multiset<Info>::iterator iter = str.begin(); iter !=str.end(); iter++)
        cout << (*iter).name<< ""<< (*iter).score << endl;
 
    return 0;
 
}

运行结果:

Bomi 80

Peti 80

Kity 70

Jack 60

版权声明:本文为博主原创文章,未经博主允许不得转载。

C++ Primer(第五版)学习笔记_7_标准模板库_multiset多重集合容器

标签:c++   stl   

原文地址:http://blog.csdn.net/keyyuanxin/article/details/46876943

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!