C++ 字母频率

C++ 字母频率,c++,C++,我有一个作业需要我计算每个单词的频率。从A-Z开始,长度是1-1000 输出取决于字符的频率及其ASCII值。如果有两个字符具有相同的频率,则将打印具有较小ASCII值的字符 如果输入为YVPDF,则输出为68 1 70 1 86 1 89 1 如何提高效率? 我尝试使用sort并创建了一个比较函数,但它不起作用 bool compare(int i,int j) { return b[index[i]] > b[index[j]]; } 它没有按我想要的方式排序。如果输入小写字

我有一个作业需要我计算每个单词的频率。从A-Z开始,长度是1-1000

输出取决于字符的频率及其ASCII值。如果有两个字符具有相同的频率,则将打印具有较小ASCII值的字符

如果输入为YVPDF,则输出为68 1 70 1 86 1 89 1

如何提高效率? 我尝试使用sort并创建了一个比较函数,但它不起作用

bool compare(int i,int j)
{
    return b[index[i]] > b[index[j]];
}

它没有按我想要的方式排序。

如果输入小写字母,则会有一个UB,因为它们的代码不是大写字母,并且在数组中只保留了26个位置

该行返回数组的大小

int len = sizeof(b) / sizeof(*b);
用它来推动向量?向量可以从数组中构造

您的结果不可生产,输出状态为:

YVPDF

21 1
13 1
0 1
7 1
2 1
还是不正确,因为那不是ASCII码,那是字母索引?如果您希望在输出中使用ascii码,则必须在索引[i]中添加“A”

还没有

b频率计数后:0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0

排序前的索引:01123456789101121415161718181922245

排序后的索引:243521513252232020181716141011109876421

你的方法有问题,这种排序并不能给你想要的结果。这实际上是一个罪魁祸首:

if (data[i] > 0)
您的数据未排序,它仍然匹配b数组的顺序,并且您在结果中打印了错误的索引。事实上,我已经用粗体标出了它们,如果您删除排序,您将通过这一行获得正确的输出:

cout << index[i]+'A' << " " << data[i] << endl;

当然,它没有分类,所以你应该为你的战略做些别的事情。例如,使用std::pair向量存储频率数据。此类排序将涉及lambda,它比较对应于频率的对成员,但两个值将同时交换。

您应该包括给出错误结果的输入示例,预期产出和实际产出output@Swift-FridayPie YVPDF是输入,68 1 70 1 86 1 89 1是不正确的输出。进行一些错误处理总是好的,尤其是在涉及I/O时。例如,输入一个非ASCII值将导致程序崩溃。我对代码做了一些更改。使用气泡排序作为索引和频率数组
86 1
78 1
65 1
72 1
67 1
if (data[i] > 0)
cout << index[i]+'A' << " " << data[i] << endl;
68 1
70 1
80 1
86 1
89 1