C++ STL 容器 multimap

阅读此篇前若有需要请先参看 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值