繁体   English   中英

对的 Map 中的 lower_bound 和 upper_bound

[英]lower_bound and upper_bound in Map of Pairs

我试图从这里了解 map 对中的lower_boundupper_bound

定义如下:

lower_bound:在 map 中, pair(x, y)lower_bound( ) 将返回一个迭代器,该迭代器指向第一个值大于或等于 x 且第二个值大于或等于 y 的对。 如果不满足上述条件,则返回一个指向对{map.size(), 0}的迭代器。

upper_bound:在 map 中, pair(x, y)upper_bound( ) 将返回一个迭代器,该迭代器指向第一个值大于 x 且第二个值大于 y 的对。 如果不满足上述条件,则返回一个指向对{map.size(), 0}的迭代器。

现在,让我们考虑下面的例子。

map<pair<int, int>, int> mp;

mp.insert({ { 2, 3 }, 8 });
mp.insert({ { 2, 5 }, 5 });
mp.insert({ { 7, 1 }, 3 });
mp.insert({ { 9, 3 }, 1 });
mp.insert({ { 5, 0 }, 3 });

我们有上面的 map 对。

现在,如果我想找到对{2, 4}的下限,结果是 {2, 5} 根据定义对我来说似乎很好。 定义说“ lower_bound 将返回一个迭代器,该迭代器指向第一个值大于或等于 x 且第二个值大于或等于 y 的对”。 因此,在这种情况下,2 等于 2,5 大于 4。

但是,如果我想找到对{2,2}的上限,结果是{2, 3}根据定义在我看来这是错误的。 定义说“ upper_bound 将返回一个迭代器,该迭代器指向第一个值大于 x 且第二个值大于 y的对”但在上述情况下,第一个值等于 x。 根据定义, {2,2}的上界应为{9, 3} ,其中 9 大于 2,3 大于 2。

我想我在这里错过了一些东西。 任何人都可以在这里帮助我吗?

您通过键值将其存储在有序的 map 中。 地图键的顺序如下:

<2, 3> | <2, 5> | <5, 0> | <7, 1> | <9, 3> 

看这里。

因此,实际的std::map::upper_bound参考说明如下:

iterator upper_bound( const Key& key );

返回一个迭代器,指向大于 key 的第一个元素。

由此不难看出,列表中大于<2, 2>的第一个键是<2, 3> (对于调用mp.upper_bound(std::make_pair(2, 2)) )。

根据 map 中的密钥类型,对于 upper_bound greater意味着更大。 在这种情况下,键是一对整数,并且一对整数的operator<用于此比较。 根据该运算符的定义,如果对的第一个元素相同,则比较第二个元素,因此确实{2, 3}大于{2, 2}

这是gnu 实现的链接以供参考。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM