C ++ WRT字符串中的STL排序功能

时间:2018-07-04 15:09:56

标签: c++ sorting stl stl-algorithm

因此,我一直在尝试根据字符频率对字符串进行排序。但是我一直在使用的在线法官向我显示错误
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 :(得分:1)

使用Lambda捕获this

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

答案 1 :(得分:0)

  

为什么我的函数调用错误?我已经使用了sort()函数   之前,但不是字符串。我的'helper()'函数不正确吗?

因为助手是解决方案的成员函数。当您这样做

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

您基本上是这样做的

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

要排序的第三个参数必须是独立函数,谓词,函子或lambda。它不能是类的非静态成员

此代码经过清理后可以正常工作。注意静态信息

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;

答案 2 :(得分:0)

成员函数的隐藏参数变为this。您需要更广泛地公开状态,或者编写捕获的lambda

如果您将一个值与其自身进行比较,则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;
    }
};