1. Multiset

Multiset是set集合容器的一种,其拥有set的全部内容,在此基础之上,multiset还具备了可以重复保存元素的功能,因此会有略微和set的差别。

Multise容器在执行insert()时,只要数据不是非法数据和空数据,insert就总是能够执行,无论时一个数据还是一段数据。

Multiset容器中的find()函数回返回和参数匹配的第一个元素的迭代器,即时存在多个元素也只是返回第一个,如{10,20,20,20}搜索20进行匹配将会返回第二个参数,如果没有符合的参数则结束迭代器。

同理诸如lower_bound()等的需要进行一个位置的返回值,则统统返回第一个发现的值。

以下是一个举例:

#include <iostream>
#include <set>
#include <algorithm>
using namespace std;
 
int main(){
    multiset<int> ms;
    ms.insert(10);
    ms.insert(20);
    ms.insert(10);
    ms.insert(20);
    ms.insert(30);
    ms.insert(50);
    //{10,20,10,20,30,50}  -----> {10,10,20,20,30,50} 插入时即会自动排序
    cout<< "发现20的位置在" << *ms.find(20)<<endl;   //这样是找不出来的哟
    
    int i=0;
    for(multiset<int>::iterator it=ms.begin();it!=ms.find(20);it++,i++){}
    cout<< "发现20的位置在" << i <<endl;    //由于是从0开始计算的因此答案是2
 
    return 0;
}

举例使用find进行查询了集合元素的位置,我们可以发现,这样使用实则麻烦而且浪费算力,的确,STL中提供的迭代器的思路是:提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。

也就是说,我们使用迭代器进行访问的时候,迭代器是不会告诉你你需要访问的元素是数据内部的第几个位置,这样匿名的思路对于工程的设计是有帮助的。

2. Multimap容器

Multimap时map映射容器的一种,其拥有map的全部内容,并在此基础之上,multimap还具有了可以重复保存元素的功能,与上文的mutliset差不多,任何进行访问单个值得语句访问均只会返回第一个位置,这里不再多说,而是举一个实际中可能用得到得例子。

 

有没有一种方法,使得一个key值能够对应多个value,产生一种诸如一个学生有多门考试成绩一样的映射

我们都知道map关联容器是使得一个数据与另一个数据发生映射的容器,通过key得到value产生一一对应,那么multimap在此基础上使得map元素可以重复,因此这种情况可以使用multimap

#include <iostream>
#include <string>
#include <map>
using namespace std;
 
int main(){
    multimap<string, int> m_map;
    string name="XiaoMing";
    m_map.insert(make_pair(name, 50));
    m_map.insert(make_pair(name, 55));
    m_map.insert(make_pair(name, 60));
    //方式1
    cout<<"----------方法1-----------"<<endl;
    int k;
    multimap<string, int>::iterator m;
    m = m_map.find(name);
    for (k = 0; k != m_map.count(name); k++, m++)
        cout << m->first << "--" << m->second << endl;
    //方式2
    cout<<"----------方法2-----------"<<endl;
    multimap<string, int>::iterator beg, end;
    beg = m_map.lower_bound(name);
    end = m_map.upper_bound(name);
    for (m = beg; m != end; m++)
        cout << m->first << "--" << m->second << endl;
    //方式3
    cout<<"----------方法3-----------"<<endl;
    beg = m_map.equal_range(name).first;
    end = m_map.equal_range(name).second;
    for (m = beg; m != end; m++)
        cout << m->first << "--" << m->second << endl;
    return 0;
}

方法一:标准的iterator的访问方法,通过find函数找到所需要知道的关系”XiaoMing”的位置,再进行”XiaoMing”的计数,输出共”XiaoMing”数量个数的元素内容,以达到需求目的。

方法二:通过lower_bound和upper_bound找到”XiaoMing”的范围进行输出。

方法三:通过equal_range获取全部的”XiaoMing”内容的元素,再通过迭代器进行输出。

 

这三种方法思想大同小异,请自主取舍进行巩固学习


点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)