C++ STL multimap容器的使用
与set相似,multimap也是可反转的经过排序的关联容器,但是键和值的类型不同,且同一个键可能和多个值相关联。
multimap的声明使用模板参数指定键的类型和存储的值的类型。例如,下面的声明将创建一个multimap对象,其中键类型为int,而存储的值类型为string:
multimap<int,string> mmap;
第3个参数是可选参数,指出对键进行排序使用的比较函数或者对象,在默认情况下,将使用模板less<Type>,该模板将键类型作为参数,注意,老式C++可能要求显式指定。
multimap为了将信息结合,实际的键类型和值结合为一对,STL使用pair<cosnt keytype,datatype>将两个值存储到一个对象中。因此上面声明的mmap对象类型应为pair<const int,string>。
使用insert成员函数进行信息插入:
multimap<int, string> mmap;
typedef pair<int, string> Pair;
mmap.insert(Pair(123, "测试"));
成员函数equal_range(),用键作为参数,返回两个迭代器,其表示区间与键参数匹配,为了返回两个值,该方法将他们封装到一个pair中,该pair的两个模板参数都是迭代器,
下面将打印123键的值
multimap<int, string> mmap;
typedef pair<int, string> Pair;
mmap.insert(Pair(123, "测试"));
mmap.insert(Pair(123, "测试2"));
auto ra = mmap.equal_range(123);
for (auto it = ra.first; it != ra.second; it++)
{
cout << (*it).second << endl;
}
上面使用了自动类型判断,其ra的类型应该为 pair<multimap<int, string>::iterator, multimap<int, string>::iterator>
count()成员函数的接受参数为键,其返回具有该键的元素数目
例如:
multimap<int, string> mmap;
typedef pair<int, string> Pair;
mmap.insert(Pair(123, "测试"));
mmap.insert(Pair(123, "测试2"));
cout << mmap.count(123);
将返回2。
还要成员函数lower_bound()和upper_boune(),其将键作为参数,且工作原理和处理set相同,详见另一篇文章:https://blog.csdn.net/qq_38421512/article/details/100833407
一般情况下,可以使用自动类型和typedef来简化代码,便于维护。