C++使用函数sort()根据词频对字符串进行排序,count()失败

wd2eg0qa  于 2022-12-15  发布在  其他
关注(0)|答案(1)|浏览(109)

我试着根据词频对字符串进行排序。例如:

  • 之前:“tetee”
  • 之后:“eeetts”

我选择在algorithm. h中使用sort()和count()函数,如下所示:

#include "bits/stdc++.h"

using namespace std;

string str="tetetafseaaaast";

bool cmp(char a, char b){
    return count(str.begin(), str.end(), a)>count(str.begin(), str.end(), b);
}

int main(){
    sort(str.begin(), str.end(), cmp);
    cout<<str<<endl;
}

然而,结果并不令人满意:“证明”
我的密码怎么了?

jv4diomz

jv4diomz1#

问题是std::sort不能保证当comparator函数被调用时字符串处于一致的状态,所以comparator函数并没有计算原始字符串中相同的字母。
下面的代码变体可以正常工作。

struct Cmp
{
    Cmp(const string& s) : s(s) {}
    bool operator()(char a, char b) const
    {
        return count(s.begin(), s.end(), a) > count(s.begin(), s.end(), b);
    }
    string s;
};

int main()
{
    string str = "tetetafseaaaast";
    Cmp cmp(str);
    sort(str.begin(), str.end(), cmp);
    cout << str << endl;
}

这里的区别在于,比较是在原始字符串的副本上进行的,而不是在排序过程中的字符串上进行的。

相关问题