обратный итератор c ++ 11 и lower_bound

У меня есть следующий пример программы:

#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, он должен возвращать итератор к первому элементу «не менее ключа». Так что я бы подумал, что вернется 5, так как 8> 6.


person Daniel    schedule 10.07.2019    source источник
comment
--a.rbegin() демонстрирует неопределенное поведение.   -  person Igor Tandetnik    schedule 10.07.2019
comment
--a.rbegin() - неопределенное поведение.   -  person NathanOliver    schedule 10.07.2019
comment
«Не меньше ключа» означает «равно или больше», поэтому 8 подходит первым. 5 меньше, чем. И, насколько мне известно, уменьшение итераций в начале - это неопределенное поведение.   -  person Sami Kuhmonen    schedule 10.07.2019
comment
lower_bound возвращает первый элемент, который ›= тот, который вы ищете.   -  person Igor Tandetnik    schedule 10.07.2019
comment
По вашему второму вопросу он возвращает не менее ключа. 5 не меньше 6?   -  person NathanOliver    schedule 10.07.2019
comment
Что вы ожидаете найти перед самым первым элементом ???   -  person curiousguy    schedule 10.07.2019


Ответы (1)


--a.rbegin () - это UB.

lower_bound(val) возвращает итератор, указывающий на первый элемент в диапазоне, который не меньше чем val. 5 не равно "не меньше 6", поэтому итератор правильно 8

person Oblivion    schedule 10.07.2019