地图中upper_bound()的奇怪行为

时间:2016-01-31 14:21:14

标签: c++ dictionary stl

我写了一个下面的示例代码来理解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

  

“迭代器指向第一个大于键的元素。如果   没有找到这样的元素,past-the-end(参见end())迭代器是   返回。“

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

以下一行:

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

确实验证了这是end的迭代器。你不应该取消引用这个迭代器。如果你这样做 - 所有赌注都已关闭,你将获得一些未指明的结果。