C ++ 11反向迭代器和lower_bound

时间:2019-07-10 20:18:51

标签: c++ c++11 reverse-iterator

我有以下示例程序:

#include <iostream>
#include <string>
#include <map>

int main()
{
  std::map<int, int> a;
  a[8] = 1;
  a[5] = 1;
  a[1] = 1;
  a[2] = 1;

  std::cout << a.begin()->first << std::endl;

  std::cout << a.rbegin()->first << std::endl;
  std::cout << (++a.rbegin())->first << std::endl;
  std::cout << (--a.rbegin())->first << std::endl;

  std::cout << (a.lower_bound(6))->first << std::endl;
}

当我执行它时,得到以下输出:

1
8
5
5
8

我有两个问题。第一个是为什么++a.rbegin()--a.rbegin()朝着相同的方向迭代? a.rbegin()返回的迭代器不是双向迭代器吗?

第二个问题是为什么a.lower_bound(6)->first返回8而不是5?基于https://en.cppreference.com/w/cpp/container/map/lower_bound,它应将迭代器返回到“不少于键”的第一个元素。所以我本来以为自8> 6后将返回5。

1 个答案:

答案 0 :(得分:2)

-a.rbegin()是UB。

lower_bound(val)返回指向范围内第一个元素的迭代器,该元素的总和不小于val5不小于“ 6”,因此您可以正确地将迭代器设置为8