0

我正在尝试处理文章或任何段落的内容[每个字符串]。首先,我将使用strtok().

之后,我想将每个单词存储在哈希表中(因为我认为这是处理大数据的最佳方式)。在处理每个单词时,我想存储每个单词的出现。最后我想得到出现时间最长的单词。

unordered_map存储带有键值的元素,并允许快速检索带有键的元素。这可能对我有用。

我不擅长 C++,所以想要一些意见。

  1. 存储整个包含char *ch ="content of article"是继续或 string::str 的好方法?我只熟悉第一个。第二,我在处理函数时感觉很复杂。

  2. 将整个内容(字符串)存储到unordered_map()中,然后如何创建包含作为单词的元素的哈希表,并且它会随之发生。然后我能得到最多出现的单词吗?

  3. 有没有其他 C++ 函数可以帮助我做我想做的事。

4

5 回答 5

3

您需要的数据结构似乎需要执行几个操作:按每个键的键(单词)和字符串值(计数)查找。但是您还希望能够打印频繁的作品,在这种情况下您需要按值排序。

没有一个标准容器可以开箱即用。由于第一次操作会经常发生,而第二次只会发生一次,因此您应该选择最适合第一次操作的容器。

std::map 和 std::unordered_map 都会做得很好。

尝试以下操作:

std::map<std::string, int>

或者

unordered_map std::map<std::string, int>

要按频率顺序打印所有作品,您必须将其复制到另一个结构中,然后对其进行排序。或者它在一次操作中。您可以将所有内容复制到

std::map<int, std::string>

然后打印出来。

于 2013-08-22T13:25:23.520 回答
2

我想将每个单词存储在哈希表中(因为我认为这是处理大数据的最佳方式)。在处理每个单词时,我想存储每个单词的出现。

这里有一些伪 C++ 可以帮助您入门:

std::unordered_map<std::string, int> occurrences;
while (more_words_available)
{
    std::string word = fetch_next_word();
    ++occurrences[word];
}

如何在while中打印每个单词的出现计数值?

你有 C++11 编译器吗?然后使用新的 foreach 循环:

for (auto p : occurrences)
{
    std::cout << p.first << " occurred " << p.second << " times.\n";
}

否则,使用带有迭代器的传统 for 循环:

for (std::unordered_map<std::string, int>::iterator it = occurrences.begin();
                                                    it != occurrences.end();
                                                    ++it)
{
    std::cout << it->first << " occurred " << it->second << " times.\n";
}
于 2013-08-22T13:26:10.020 回答
1

你不需要(也不想要)strtok。如果空格是单词的分隔符,只需使用读入字符串即可>>;整个输入阶段将是:

std::unordered_map<std::string, int> counts;
std::string word;
while ( source >> word ) {
    ++ counts[word];
}

根据要求,您可能希望在计算单词之前将单词转换为小写,或者从中删除最后的标点符号(这样word,WordWord.都是相同的)。

对于按计数排序的访问,最简单的是将地图的内容复制到一个std::vector<std::pair<std::string, int>>并对其进行排序。(不要忘记你可以从两个迭代器构造一个向量。所以这只是多两行。)

于 2013-08-22T13:35:35.437 回答
1
  1. 使用字符串总是更容易
  2. 单词可以用作键,也可以用作值。基于键的检索从 unordered_map 快速。获得最大数量的单词需要遍历整个地图。您的问题是您需要 2 个索引。
  3. 考虑使用 Boost::MultiIndex 在容器中创建 2 个索引。
于 2013-08-22T13:20:44.513 回答
1

如果您的文章在文件中,test.txt那么您可以像这样创建地图:

#include<fstream>
#include<map>
#include<string>

using namespace std;
int main()
{
    ifstream in_file("test.txt");
    map<string,int> words;

    string tword;
    while(in_file >> tword)  //line 12
        words[tword]++;
}

您还可以将整个内容存储istringstream ss并使用它而不是in_file上面:

while(ss >> twords)  //line 12
于 2013-08-22T13:33:27.837 回答