阅读此篇前若有需要请先参看 C++ STL 容器 map 的介绍。
map 中不允许存在相同的元素,而 multimap 允许。这一设计上改变也带来一些使用上的不同。
访问 multimap 中的元素
由于 multimap 中允许存在关键字值相同的元素。因此我们很难想象通过下标访问会发生什么,实际上 multimap 并不允许通过下标来访问其中的元素。由于 map 中的元素是依照 index 的递增顺循序排列的,multimap 依然保持了这一特性,因此在 multimap 中具有相同 index 值的元素会相邻存储。这里提供三种解决方案:
**使用 .find 结合 .count **
我们可以先是用 .find 找出第一个匹配 index 值的元素的迭代器,再利用 .count 得到该 multimap 中一共有多少个具有该 index 值的元素。
multimap<char, int> mm = {
{
'a', 1}, {
'a', 2}, {
'b', 3}};
auto it = mm.find('a');//it = mm.begin()
int size = mm.count('a');//size = 2
while (size > 0) {
cout << it->second << " ";size--;
} // 输出:1 2
使用 .lower_bound 和 .upper_bound
.lower_bound 返回 multimap 中第一个关键字不小于给定值元素的迭代器
.upper_bound 返回 multimap 中第一个关键字大于给定值元素的迭代器
multimap<char, int> mm = {
{
'a', 1}, {
'a', 2}, {
'b', 3}};
auto b = mm.lower_bound('a');//it = mm.begin()
auto e = mm.upper_bound('a');//size = 2
for (auto it=b; it!=e; it++) {
cout << it->second << " ";
}
// 输出:1 2
即 .lower_bound 和 .upper_bound 的返回的是一个关于查找关键字的左闭右开区间
[ .lower_bound, .ipper_bound )
当 .lower_bound 与 .ipper_bound 值相等时,意为 multimap 中不存在具有该关键字的元素。
使用 .equal_range 函数
.equal_range 会返回一个 pair,此 pair 的第一个成员即是 .lower_bound 的返回值;第二个成员即是 .upper_bound 的返回值。
multimap<char, int> mm = {
{
'a', 1}, {
'a', 2}, {
'b', 3}};
auto p = mm.equal_ragne('a'); //
for (auto it=p.first; it!=p.second; it++) {
cout << it->second << " ";
}
// 输出:1 2