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

Нужна помощь: делаю частотный словарь на c++. Нужно сделать сортировку по значениям элементов, например:

{{"Вася", 1}, {"Петя", 4}, {"Андрей", 3}, {"Пётр", 7}, {"Андрей", 15}}; // Неотсортированный словарь

{{"Вася", 1}, {"Андрей", 3}, {"Петя", 4}, {"Пётр", 7}, {"Андрей", 15}}; // Отсортированный словарь

Так вот: я сделал такую же сортировку только вставкой, но получаю такие ошибки:

36:37 [Error] passing 'const std::basic_string' as 'this' argument of 'std::basic_string<_CharT, _Traits, _Alloc>& std::basic_string<_CharT, _Traits, _Alloc>::operator=(const std::basic_string<_CharT, _Traits, _Alloc>&) [with _CharT = char; _Traits = std::char_traits; _Alloc = std::allocator]' discards qualifiers [-fpermissive]

37:14 [Error] passing 'const std::basic_string' as 'this' argument of 'std::basic_string<_CharT, _Traits, _Alloc>& std::basic_string<_CharT, _Traits, _Alloc>::operator=(const std::basic_string<_CharT, _Traits, _Alloc>&) [with _CharT = char; _Traits = std::char_traits; _Alloc = std::allocator]' discards qualifiers [-fpermissive]

Что они могут значить и как решить эту проблему?

#include <iostream>
#include <map>
#include <string>
#include <fstream>
#include <stdlib.h>
using namespace std;

int main (){
    system ("chcp 1251");
    system ("cls");
    map <string, int> lib;
    map <string, int>::iterator i;
    ifstream fin ("text.txt", ios_base::in);
    if (!fin.is_open()) {
        cout << "Ошибка: файл не может быть открыт.";
        return 0;
    }
    string word;
    while (fin >> word) {
        i = lib.find(word);
        if (i == lib.end()){
            lib.insert ({word, 1});
        } else {
            lib[word]++;
        }
    }
    fin.close();
    // begin sort
    
    int n = lib.size();
    int max = 999999999;
    for (auto i = lib.begin(); i != lib.end(); i++) {
        for (auto j = i; j != lib.end(); j++) {
            if ((j->second < i->second) && (j->second < max)) {
                string bufer = i->first; int buferindex = i->second;
                i->second = j->second; i->first = j->first;
                j->first = bufer; j->second = buferindex;
            }
        }
    }
    
    // end sort
    ofstream fout ("output.txt");
    for (auto i = lib.begin(); i != lib.end(); i++) {
        fout << i->first << " : " << i->second << endl;
    }
    fout.close();
}

Настройки компилятора:

-luuid -loleaut32 -lole32 -std=c++11

Dev-cpp 5.11


Ответы (1 шт):

Автор решения: KoVadim

map уже отсортирован внутри по определенным правилам. Просто так его пересортировать нельзя. Если хочется отсортировать так, как хочется, то нужно перебросить все в вектор, а там уже сортировать и выводить.

#include <iostream>
#include <vector>
#include <map>

int main() {
    std::map <std::string, int> lib;
    // тут был код  заполнения lib
    lib.insert({"f", 1});
    lib.insert({"a", 2});
    lib.insert({"v", 3});
    // это вектор для сортировки
    std::vector<std::pair<int, std::string>> fr;
    for (const auto& el : lib) {
       fr.push_back({el.second, el.first});
    }
    // собственно, сортируем
    std::sort(fr.begin(), fr.end(), [](const auto& el1, const auto& el2) { return el1.first > el2.first;});
    // выведем
    for (const auto& el : fr) {
        std::cout << el.first << "\t: " << el.second << "\n";
    }
}
→ Ссылка