地图中 upper_bound() 的奇怪行为

Posted

技术标签:

【中文标题】地图中 upper_bound() 的奇怪行为【英文标题】:Strange behavior of upper_bound() in Maps 【发布时间】:2016-01-31 14:21:14 【问题描述】:

我编写了下面的示例代码来理解 Map 中的 upper_bound(),但是我无法理解下面的行为:-

// Sample upper_bound()
#include <iostream>
#include <map>
#include <limits>

int main ()

  std::map<unsigned int,int> mymap;
  std::map<unsigned int,int>::iterator itup;

  mymap[0] = 5;
  mymap[5] = 5;
  mymap[10] = 5;
  mymap[15] = 5;
  mymap[20] = 5;
  mymap[25] = 5;
  mymap[30] = 5;

  // print content:
  for (std::map<unsigned int,int>::iterator it=mymap.begin(); it!=mymap.end(); ++it)
    std::cout << it->first << " => " << it->second << '\n';


  itup=mymap.upper_bound (30);


  std::cout<<"First "<< itup->first<<": Second "<< itup->second<<"\n";

  return 0;

来自http://en.cppreference.com/w/cpp/container/map/upper_bound,

"迭代器指向第一个大于key的元素。如果 没有找到这样的元素,结束(见 end())迭代器是 回来了。”

为什么过去的迭代器会返回这样的值?

【问题讨论】:

【参考方案1】:

由于没有严格大于30 的键,itup 是结束迭代器。不允许取消引用结束迭代器,因此您的程序具有未定义的行为。

【讨论】:

感谢您的回复。我试图在另一篇帖子***.com/questions/8415718/… 中理解您的答案。我可以在其他地方联系你吗,在我这里没有聊天选项吗?【参考方案2】:

下面一行:

std::cout << std::boolalpha << (mymap.upper_bound(30) == mymap.end()) << std::endl; 

确实验证了这是end 的迭代器。您不应该取消引用此迭代器。如果你这样做了——所有的赌注都被取消了,你会得到一些未指定的结果。

【讨论】:

以上是关于地图中 upper_bound() 的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章

Google Maps API - 奇怪的地图“偏移”行为

2048:使用 lodash/fp 的地图中 reduceRight 的奇怪行为

Linq 的奇怪行为

奇怪的PHP谷歌地图嵌入在iframe中的行为

在java中格式化小数百分比会产生非常奇怪的行为

如何理解lower_bound/upper_bound