У меня есть следующий пример программы:
#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.
--a.rbegin()
демонстрирует неопределенное поведение. - person Igor Tandetnik   schedule 10.07.2019--a.rbegin()
- неопределенное поведение. - person NathanOliver   schedule 10.07.2019lower_bound
возвращает первый элемент, который ›= тот, который вы ищете. - person Igor Tandetnik   schedule 10.07.2019