multiset是指允许有重复键值的集合,multimap是指允许一个键值对应多个附加数据的映射(如同一门课程名(键值)一周内对应多个不同的上课时间(附加数据))。
对于多重关联容器,一般较多使用成员函数equal_range和count。
equal_range函数的使用如下:
multimap<string,string>s;
string name;
cin>>name;
pair<multimap<string,string>::iterator,multimap<string,string>::iterator> p;
p=s.equal_range(name);
即equal_range返回的是一个二元组,二元组里面的first和second是两个multimap<string,string>::iterator类型的迭代器,multimap迭代器区间[p.first,p.second)里包含了所有键为name的元素。
count函数的使用如下:
multimap<string,string>s;
string name;
cin>>name;
int num;
num=s.count(name);
返回multimap中键为name的元素的总个数。
一个多重映射的完整例子如下:
//上课时间查询
#include<iostream>
#include<map>
#include<utility>
#include<iterator>
#include<string>
using namespace std;
int main() {
multimap<string, string>courses;
typedef multimap<string, string>::iterator courseiter;
courses.insert(make_pair("C++","2-6"));
courses.insert(pair<string, string>("JAVA", "3-1"));
courses.insert(make_pair("JAVA", "5-2"));
courses.insert(make_pair("OS", "1-2"));
courses.insert(make_pair("OS", "4-1"));
courses.insert(make_pair("OS", "5-5"));
//查找课程
string name;
int count;
do {
cin >> name;
count = courses.count(name);//count函数:得到courses容器中键为name的元素个数
if (count == 0)
cout << "cannot find this course,please input again." << endl;
continue;
} while (count == 0);
//输出每周上课的次数和时间
cout << count << " lesson(s) per week:" << endl;
pair<courseiter, courseiter>range;
range = courses.equal_range(name);//equal_range函数:得到一个用pair<multimap<string, string>::iterator,multimap<string, string>::iterator>表示的区间,该区间包含所有键为name的元素
//即对于返回的二元组range,迭代器区间[range.first,range.second)包含了所有键为name的元素
for (courseiter it = range.first; it != range.second; it++)
cout << it->second << " ";
cout << endl;
system("pause");
return 0;
}