【问题标题】:lower_bound and upper_bound in Map of Pairs对映射中的 lower_bound 和 upper_bound
【发布时间】:2021-03-10 02:20:31
【问题描述】:

我正在尝试了解来自here 的成对映射中的 lower_boundupper_bound

定义如下:

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

上界: 在对 upper_bound() 的映射中,对于 pair(x, y) 将返回一个迭代器,该迭代器指向第一个值大于 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 });

我们有上面的配对图。

现在,如果我想找到对 {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。 p>

我想我在这里遗漏了一些东西。有谁能帮帮我吗?

【问题讨论】:

  • 对于极客来说,极客太常见了,文章的质量非常低。 will return an iterator pointing to the pair whose first value is greater than or equals x and second value is greater than or equals to y此说法不正确。 upper_bound 语句同样不正确。作者似乎不明白如何使用配对进行比较(或者他们确实理解但无法清楚地表达自己)。
  • @john,我认为这是真的,但前提是您认为他们所指的 pair 是用于映射中键的对。
  • @FantasticMrFox 作者似乎认为 p1

标签: c++ stl


【解决方案1】:

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

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

See here.

所以,实际的std::map::upper_bound reference 是这样说的:

iterator upper_bound( const Key&amp; key );

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

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

【讨论】:

    【解决方案2】:

    for upper_bound greater 根据映射中键的类型表示更大。在这种情况下,关键是一对整数,并且一对整数的operator&lt; 用于此比较。根据该运算符的定义,如果对的第一个元素相同,则比较第二个元素,所以{2, 3}确实大于{2, 2}

    这里是gnu implementation 的链接供参考。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多