2016-12-01 3 views
3

Поскольку оба набора и карта являются упорядоченными контейнерами, можно ли найти min и max в 0 (1) раз для std :: map, как в std :: set?Как найти min/max в std :: map как в std :: set?

// for std::set 
// std::set<int> s; 
auto min = *s.begin(); 

auto max = *s.rbegin(); 

Как получить max и min в O (1) с std :: map? Другие вопросы здесь, похоже, предлагают перебирать по карте, но не можем ли мы использовать упорядоченное свойство std :: map, чтобы быстрее получить результат?

+1

Нет, я не верю, что это возможно. поскольку сортировка на карте зависит от типа ключа. –

+0

Могу ли я найти наименьший ключ за 0 (1) раз? – nnrales

+1

У меня был [аналогичный ответ] (http://stackoverflow.com/a/7648812) некоторое время назад. –

ответ

6

разыменовывает первое из итератора для ключа, как это:

// for std::map<int,string> s 
auto minKey = s.begin()->first; 
auto maxKey = s.rbegin()->first; 

Это работает только для ключей, а не значение, так как карты сортируются только на ключах.

+0

прекрасный спасибо. Мне показалось, что должен быть лучший путь, чем повторение этого. Я, хотя это может быть ответом, но хотел проверить. – nnrales

+0

Да, я просто хотел найти самый маленький ключ. – nnrales

+0

Этот ответ очень умный, но я нашел формулировку «Развертывание сначала из итератора для ключа, вот так» взял несколько анализов для поиска. Возможно, стоит добавить дополнительное предложение о том, что карты всегда хранятся в порядке, поэтому ключ первого/последнего элементов будет наименьшим/самым большим соответственно. Независимо от +1. – Vality

Смежные вопросы