Сортировка словаря в 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 шт):
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";
}
}