обратный итератор c ++ 11 и lower_bound - PullRequest
0 голосов
/ 10 июля 2019

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

#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.

1 Ответ

2 голосов
/ 10 июля 2019

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

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

...