У меня есть массив чисел, и мне нужно отсортировать их по частоте в порядке возрастания
и если оба числа одинаковы, отсортируйте их в порядке убывания.
я создал unordered_map и сохранил частоту номеров в карте
и внутри пользовательской функции сортировки я использовал ее для сортировки чисел
Реализация выглядит так
class Solution {
public:
unordered_map<int,int>map;
bool operator ()(const int &a,const int &b){
if (map[a]==map[b])
return a>b;
return map[a]<map[b];
}
vector<int> frequencySort(vector<int>& nums) {
vector<int>answer;
for(auto num:nums)
map[num]++;
sort(nums.begin(),nums.end(),Solution());
return nums;
}
};
но когда я использую эту пользовательскую функцию, я даю неправильный ответ, например
for input nums = [1,1,2,2,2,3]
output is [3,2,2,2,1,1]
чего не ожидается!! но реализация функций выглядит хорошо
так что ожидаемоExpected [3,1,1,2,2,2]
Чтобы добиться этого, я вижу решение, и они использовали функцию лямда для индивидуальной сортировки
Реализация лямбда-функции похожа
sort(nums.begin(),nums.end(),[&](int a, int b) {
if (map[a] == map[b]) {
return a > b;
}
return map[a] < map[b];
});
Часть тела моей функции и лямбда-функции аналогичны
но почему я получаю неправильный ответ?
Спасибо
Извините, но это слишком хорошо показывает, почему не следует использовать так называемые сайты-соревнования для изучения основ программирования или языков программирования. хорошая книга или две , хорошие онлайн-ресурсы или настоящие занятия должны научить вас всем основам и многому другому.
@Quimby, но если я вычислю значения карты в функции, это даст мне некоторый результат,
Да, конечно, но это не тот map, к которому вы передаете std::sort, каждый экземпляр Solution имеет свой собственный независимый map объект, и вы перешли к std::sort новому Solution объекту. Прислушайтесь к совету @Someprogrammerdude и возьмите книгу, чтобы изучить концепции языка, эти сайты вас не научат.
Используйте лямбда-человека. Это так удобно. И ваша функция компаратора нуждается в улучшении. Вы обращаетесь к карте так много раз, что это должно быть только дважды (один для a, один для b).
Кажется, вы создали вторую учетную запись после того, как этот вопрос был закрыт stackoverflow.com/questions/78781522/…
Я попробовал это и увидел странное поведение: godbolt.org/z/v98c9c5T4
Я попробовал 3 решения: godbolt.org/z/rWKzbjKdT, лямбда-версия выглядит лучше. Другие демонстрировали странные результаты (слишком много вызовов деструктора).
@3CxEZiVlQ ни в коем случае я здесь не для того, чтобы учиться! не для того, чтобы получить голоса "за", спасибо
@Куимби, конечно, спасибо





Как Куимби уже упоминал в комментариях, вы передаете временный экземпляр Solution в качестве параметра Comparestd::sort, но этот временный объект является новым экземпляром Solution, и все его переменные-члены и функции-члены находятся в состоянии по умолчанию. В этом состоянии по умолчанию Solution::map является созданным по умолчанию std::unordered_map, а не std::unordered_map, находящимся в настоящее время в исходном экземпляре Solution, поэтому он не знает частот, которые в данный момент хранятся в оригинале. Чтобы использовать оригинал в качестве функции сравнения для std::sort, передайте оригинал в std::sort.
std::sort(nums.begin(),nums.end(), *this);Я вижу какое-то странное поведение, слишком много вызовов деструктора, почему: godbolt.org/z/v98c9c5T4
std::ref(*this) — это позволяет избежать всех этих копий. Спасибо за ссылку.
Вы создаете и передаете
std::sortвременныйSolution()объект,mapкоторого пуст.