4. Сортируем словарь (C++)

☰ Теория

Сортировка словаря в С++

Главное
  1. Обычный map - всегда отсортирован по ключам (A-Z, 0-9)
  2. Чтобы сортировать по значениям - делаем вектор из пар и сортируем его
  3. Для обратного порядка - используем greater<> или меняем знак в функции сравнения
// 1. Берем словарь
map<string, int> dict = {{"banana", 3}, {"apple", 1}, {"cherry", 2}};

// 2. Делаем из него вектор
vector<pair<string, int>> items(dict.begin(), dict.end());

// 3. Сортируем вектор по числам (значениям)
sort(items.begin(), items.end(), compareByValue);

// 4. Используем отсортированный вектор

compareByValue - это простая функция, которая говорит сортировке как сравнивать элементы.

Как работает

bool compareByValue(pair<string, int> a, pair<string, int> b) {
    return a.second < b.second;
}

Что означают a.second и b.second?

  • a.second - значение первого элемента (число)
  • b.second - значение второго элемента (число)

Правило простое:

  • return a.second < b.second = сортировать по возрастанию (1, 2, 3)
  • return a.second > b.second = сортировать по убыванию (3, 2, 1)

 


Что такое pair?

pair - это контейнер для двух значений. Как карманы в штанах - в левый положили одно, в правый - другое.
 

pair<string, int> fruit = {"apple", 5};

cout << fruit.first;   // "apple" - первое значение
cout << fruit.second;  // 5       - второе значение
Используется при:
  • работе со словарями, 
  • возврате двух значений из функции
  • хранении координаты точки (x,y) 
Pair - это просто два значения в одной упаковке!

Алфавитно-частотный словарь - это частотный словарь, в котором слова с указанием их частоты (встречаемости) расположены по алфавиту.
Постройте словарь, отсортированный по частоте слов, в котором слова расположены порядке уменьшения их частоты встречаемости, справа от каждого слова должно быть указано сколько раз оно встречается в тексте. Если количество слов одинаково, сортировка идет по словам в лексикографическом порядке.  Признаком окончания текста является "END!". 

Входные данные
На вход подаются строки текста. Последняя строка содержит одно единственное слово "END!" и является признаком окончания текста.

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

 
Примеры
Входные данные Выходные данные
1 один два
три один
два
END!
два 2
один 2
три 1

Напишите программу
Auto
       

time 1000 ms
memory 256 Mb
Правила оформления программ и список ошибок при автоматической проверке задач

Статистика успешных решений по компиляторам
Комментарий учителя