繁体   English   中英

带前导数字的字符串排序向量

[英]Sorting vector of strings with leading numbers

我正在处理一个作业问题,该问题要求我从输入文件中读取单词,并读取整数k。 该解决方案需要打印出单词及其频率的列表,范围从最频繁到第k个最频繁。 如果唯一单词的数量小于k,则仅输出该单词的数量。

这本来可以用地图之类的容器来解决,但是问题使我只能使用向量和字符串,而不能使用其他STL容器。

我被卡在文件中所有单词及其对应频率的列表中。 现在,我需要根据它们的频率对其进行排序,并输出k个字。

问题是,排序很困难。 频率可以是不同的数字。 如果我使用string::sort()对零进行填充string::sort() ,由于程序员不知道输入,我将不知道要填充多少个零。

这是该函数的代码:

void word_frequencies(ifstream& inf, int k)
{
    vector <string> input;
    string w;
    while (inf >> w)
    {
        remove_punc(w);
        input.push_back(w);
    }
    sort(input.begin(), input.end());

    // initialize frequency vector
    vector <int> freq;
    for (size_t i = 0; i < input.size(); ++i) freq.push_back(1);

    // count actual frequencies
    int count = 0;
    for (size_t i = 0; i < input.size()-1; ++i)
    {
        if (input[i] == input[i+1])
        {
            ++count;
        } else
        {
            freq[i] += count;
            count = 0;
        }
    }

    // words+frequencies
    vector <string> wf;
    for (size_t i = 0; i < freq.size()-1; ++i)
    {

        if (freq[i] > 1 || is_unique(input, input[i]))
        {
            string s = to_string(freq[i]) + " " + input[i];
            wf.push_back(s);
        }
    }
}

另外,我是否应该首先将频率与单词结合起来? 我知道这很麻烦,所以我正在寻找更优雅的解决方案。

谢谢!

据我了解,您的问题是您想对频率向量进行排序,但是您却无法跟踪它们对应的单词。 如建议的那样,将结构与自定义比较功能一起使用可能是理想的:

struct word_freq {
    int freq;
    std::string word;
};

bool operator<(const word_freq& a, const word_freq& b) {
    return a.freq < b.freq;
}

现在,有了std::vector<word_freq> wf; 并应用std::sort(wf.begin(), wf.end())应该将列表最小->最大。 要以最高频率打印k单词,可以从wf列表的后面打印。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM