【问题标题】:STL sort function in C++ wrt stringsC++ wrt字符串中的STL排序函数
【发布时间】:2018-07-04 15:09:56
【问题描述】:

所以我一直在尝试根据字符的频率对字符串进行排序。但是我一直在使用的在线法官向我显示错误
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;
}
};

【问题讨论】:

  • 获取few good C++ books 阅读,从头开始正确学习 C++。然后您还将了解您现在拥有的代码有什么问题。
  • 不同的字母可能有相同的频率。也许根据频率做一个普通的sort(begin, end),然后是一个stable_sort(begin, end, frequency_test)
  • if (a &gt; b) return false; else return true; --> return a &lt;= b;.
  • 一个Compare 谓词必须返回false,如果你将一个值与它自己进行比较,你的不会。只需return freq[c1] &lt; freq[c2];

标签: c++ sorting stl stl-algorithm


【解决方案1】:

使用 lambda 捕获 this

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

【讨论】:

    【解决方案2】:

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

    因为 helper 是 Solution 的成员函数。当你这样做时

    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;
    

    【讨论】:

      【解决方案3】:

      成员函数有一个隐藏参数,变为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;
          }
      };
      

      【讨论】:

        猜你喜欢
        • 2018-10-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多