[英]lower_bound and upper_bound in Map of Pairs
我试图从这里了解 map 对中的lower_bound和upper_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.