Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Создание компаратора для сортировки map с++

Татьяна Казарина Профи (729), закрыт 2 недели назад
 #include  
using namespace std;
//bool comp(map & a , map & b) {
// return a.second > b.second;
//}
int main() {
int n;
cin >> n;
map mapa;
set vec;
for (int i = 0; i < n; ++i) {
string s;
cin >> s;
if (vec.count(s) == 1) {
mapa[s] = i;
} else {
vec.insert(s);
mapa.insert(make_pair(s, i));
}
}
for (const auto& [val, key] : mapa) {
cout << val << " " << key << endl;
}
sort(mapa.begin(), mapa.end(), comp);
}
Всем привет, имеется код который создает нужную map, но ее нужно отсортировать по убыванию ключа. Тот компаратор что я написал не работает. Помогите разобраться с ним пожалуйста.
Лучший ответ
Сергей Гений (56865) 2 недели назад
map использует внутренний механизм сортировки, поэтому его нельзя сортировать c помощью sort
если требуется другой порядок то компаратор добавляется третьим параметром в шаблон (по умолчанию это less<> а в вашем случае достаточно greater<> )
 map> mapa; 
Впрочем не совсем понял для чего вам нужен set и что вообще требуется от кода.
Татьяна КазаринаПрофи (729) 2 недели назад
Здравствуйте, я решаю эту задачу.
Татьяна КазаринаПрофи (729) 2 недели назад
если сделать то что вы сказали получится такой ответ. А мне надо, чтобы по вывод был по убыванию ключа
Татьяна КазаринаПрофи (729) 2 недели назад
тоесть isaac ruben aaron как и должно быть
Сергей Гений (56865) Татьяна Казарина, Подождите, щас решим.
Татьяна КазаринаПрофи (729) 2 недели назад
по убыванию не ключа, а второго элемента, то есть значения все-таки. ошибочка
Сергей Гений (56865) Татьяна Казарина, Весь смысл в том, что нужно было перекладывать данные из map в другой контейнер, чтобы отсортировать по значению а не по ключу.
Остальные ответы
climate Профи (857) 2 недели назад
Проблема в вашем коде заключается в том, что map не имеет методов begin() и end() для сортировки, как, например, у вектора. Вместо этого вы можете использовать вектор пар (std::pair) для сортировки элементов вашей map.

Вот как можно отсортировать map по убыванию ключа:

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

bool comp(const std::pair<std::string, int>& a, const std::pair<std::string, int>& b) {
return a.first > b.first;
}

int main() {
int n;
std::cin >> n;
std::map<std::string, int> mapa;
for (int i = 0; i < n; ++i) {
std::string s;
std::cin >> s;
if (mapa.count(s) == 1) {
mapa[s] = i;
} else {
mapa.insert(std::make_pair(s, i));
}
}

std::vector<std::pair<std::string, int>> vec(mapa.begin(), mapa.end());
std::sort(vec.begin(), vec.end(), comp);

for (const auto& [val, key] : vec) {
std::cout << val << " " << key << std::endl;
}

return 0;
}
Этот код создает вектор пар (ключ, значение) из вашей map, сортирует его по убыванию ключа при помощи компаратора comp, а затем выводит отсортированные значения.
Татьяна КазаринаПрофи (729) 2 недели назад
чат гпт не правильно выдает, надо самому думать
Андрей Высший разум (429897) 2 недели назад
 int n;
cin >> n;
map a;
for (int i = 0; i < n; ++i) {
string s;
cin >> s;
a[s] = i;
}
set> b;
for (auto &v : a) { b.insert(make_pair(-v.second, v.first)); }
for (auto &v : b) { cout << v.second << '\n'; }
Татьяна КазаринаПрофи (729) 2 недели назад
Спасибо
Demon On Wheels Просветленный (30569) 2 недели назад
 struct 
{
bool operator() (const map::value_type& a, const map::value_type& b) const
{
return a.second > b.second;
}
}
comp;
Попробуй так.
Татьяна КазаринаПрофи (729) 2 недели назад
Так не работает. Т.к map не сортируется
Похожие вопросы