Функция сортировки STL в строках C ++ - PullRequest
0 голосов
/ 04 июля 2018

Итак, я пытался отсортировать строку по частоте ее символов. Однако онлайн-судья, который я использовал, показывает мне ошибку
Line 17: invalid use of non-static member function 'bool olution::helper(char, char)'
Почему неправильный вызов моей функции? Я использовал функцию sort() раньше, но не для строк. Моя helper() функция неверна?

class Solution {
public:
unordered_map<char,int> freq;

bool helper(char c1,char c2){
    if(freq[c1]>freq[c2]) return false;
    else return true;
}
string frequencySort(string s) {

    for(char c:s)
    {
        freq[c]++;
    }

    sort(s.begin(),s.end(),helper);

    return s;
}
};

Ответы [ 3 ]

0 голосов
/ 04 июля 2018

Почему вызов моей функции неправильный? Я использовал функцию sort () раньше, но не в строки. Моя функция helper () неверна?

Поскольку помощник является функцией-членом Solution. Когда вы делаете это

sort(s.begin(),s.end(),helper);

вы в основном делаете это

sort(s.begin(),s.end(),this->helper);

3-й параметр для сортировки должен представлять собой отдельную функцию, предикат, функтор или лямбду. Он не может быть нестатическим членом класса

Этот код, вычищенный, работает. Обратите внимание на статику

class Solution {
public:
    // using thread_local so that each thread
    // has its own global variable.
    static thread_local std::unordered_map<char, int> freq;

    static bool helper(char c1, char c2) {
        return (freq[c1]<freq[c2]);
    }

    std::string frequencySort(std::string s)
    {
        freq.clear();

        for (char c : s)
            ++freq[c];

        std::sort(s.begin(), s.end(), helper);

        return s;
    }
};

// definition
std::unordered_map<char, int> Solution::freq;
0 голосов
/ 05 июля 2018

Функции-члены имеют скрытый параметр, который становится this. Вам нужно либо более широко раскрыть состояние, либо написать захватывающую лямбду

Также предикат Compare должен возвращать false, если вы сравниваете значение с самим собой, ваше - нет.

class Solution {
public:
    string frequencySort(string s) {

        unordered_map<char,int> freq;

        for(char c:s)
        {
            freq[c]++;
        }

        sort(s.begin(),s.end(),[&freq](char lhs, char rhs){ return freq[lhs] < freq[rhs]; });

        return s;
    }
};
0 голосов
/ 04 июля 2018

Используйте лямбду для захвата this:

sort(s.begin(),s.end(),[this](auto a, auto b) -> bool { return helper(a,b); });
...