c++ 如何计算字符串并对其排序?[已结束]

ars1skjm  于 2022-12-01  发布在  其他
关注(0)|答案(1)|浏览(107)

已关闭。此问题需要更多focused。当前不接受答案。
**想要改进此问题吗?**更新问题,使其仅关注editing this post的一个问题。

11天前关闭。
Improve this question
我正在读取一个输入文件,并希望读取所有的字母和符号。我希望从这个文件中创建一些更大的东西,比如最终对它进行编码--但我似乎无法摆脱这个模块,试图读取字符,并在一个向量中使用它的频率,我会在一个堆中运动。对于上下文,我如何才能得到这样的东西:

"I am soo stuck."  --> i:1 a:1 m:1 s:2 o:2 t: 1 u:1 c: 1 k:1 :3 (represents spacing)

--我怎么能从最小频率到最大频率排序呢?我试过Map,矢量,对--所有的东西--但是无论我试什么都不管用

dgtucam1

dgtucam11#

最直接的方法是首先为频率创建一个std::map(类似于字典Map,但需要使用std::(unordered)_map<char, int>而不是<int,char>),然后使用std::multimap插入所有反向对。

#include <iostream>
#include <map>
#include <string>

void print_frequencies(std::string text) {
    std::map<char, int> dictionary;
    for(auto c: text) {
        dictionary[c]++;
    }

    std::multimap<int, char> reverse;
    for ( auto [c, i] : dictionary ) {
        reverse.emplace(i, c);
    }

    for ( auto [i, c] : reverse ) {
        std::cout << c << ':' << i << '\n';
    }
}

int main() {
    print_frequencies("I am soo stuck.");
}

这是因为std::multimap按照键的顺序存储它的元素,你可以在godbolt编译器资源管理器上实时使用它。
如果你只是碰巧有一个C17之前的编译器,你就不能使用结构化绑定,而需要使用老式的std::pair成员。例如,在C14中,第二个循环看起来像这样:

for ( auto e : dictionary ) {
    reverse.emplace(e.second, e.first);
}

相关问题