Порядок в std::map
определяется только сравнением ключей, поэтому “сортировать по значениям” напрямую нельзя.
Обычно алгоритм в похожих задачах такой:
- считаем частоты слов в словаре,
- затем переносим пары (слово, частота) в вектор
- и сортируем вектор компаратором:
- сначала по частоте по убыванию,
- а при равенстве — по слову в лексикографическом порядке.
Ассимптотика
подсчет в
map
— примерно O(nlogm), в unordered_map — амортизированно O(n),
сортировка вектора из m уникальных слов — O(mlogm).
Создание вектора пар из словаря
map<string, int> freq;
...
vector< pair<string, int> > items(freq.begin(), freq.end());
Это выражение использует так называемый “диапазонный” конструктор
std::vector
, который принимает два итератора
first
и
last
и создаёт вектор из элементов полуинтервала.
В указанном примерем
first = freq.begin()
, а
last = freq.end()
, поэтому создаётся
vector<pair<string,int>> items
, в который последовательно копируются элементы из указанного диапазона источника без пропусков и дубликатов в пределах этого полуинтервала.