Последний ключ в std::map

Я ищу самое высокое значение ключа (определяемое оператором сравнения) std::map.

Гарантировано ли это

map.rbegin()->first

?

(Я немного не уверен в обратных итераторах, и сколько свободы в реализации std::map)

Если нет, пожалуйста, сообщите. Я не могу изменить структуру данных.


person peterchen    schedule 14.11.2008    source источник


Ответы (4)


да. Карта — это отсортированный контейнер, обратный итератор должен возвращать элементы в обратном (то есть убывающем) порядке их ключей.

[Редактировать: как указывает Чарльз Бейли в своем ответе, ваш код дает лучший ключ, если он существует, т.е. если карта не пуста]

person Steve Jessop    schedule 14.11.2008

Да, но не забудьте проверить, что map.rbegin() != map.rend().

person CB Bailey    schedule 14.11.2008
comment
Все они эквивалентны проверкам. - person CB Bailey; 14.11.2008
comment
... в то время как .empty() гарантированно будет O (1). (просто чтобы уточнить, что сказал Андреас) - person Thomas; 01.07.2009

Вы можете использовать следующий метод: -

if(!map.empty())
    (--map.end())->first;
person birubisht    schedule 22.11.2016
comment
Это не гарантирует работу. std::prev(map.end())->first безопаснее. - person Kai Petzke; 05.02.2021
comment
@KaiPetzke да, именно поэтому я сначала проверил карту. что еще может пойти не так, пожалуйста, уточните. Благодарность - person birubisht; 23.06.2021
comment
Проблема в том, что стандарт C++ не требует, чтобы вы могли применить оператор -- к rvalue map.end(). Дополнительные пояснения см. в примечаниях к en.cppreference.com/w/cpp/iterator/. предыдущая - person Kai Petzke; 28.06.2021

Еще один способ -

std::prev(map.end())->first;
person Alam    schedule 15.11.2020