我正在尝试创建一个程序来计算文件中单词的唯一出现次数,然后按字母顺序显示它们的计数。
关键是以最快和最有效的方式做到这一点。
请记住,我正在使用 C++ 编写代码,但我并不反对纯理论答案。
有什么建议吗?
我正在尝试创建一个程序来计算文件中单词的唯一出现次数,然后按字母顺序显示它们的计数。
关键是以最快和最有效的方式做到这一点。
请记住,我正在使用 C++ 编写代码,但我并不反对纯理论答案。
有什么建议吗?
这是一个使用 cin 的示例。
#include <iostream>
#include <string>
#include <map>
using namespace std;
int main() {
string word;
std::map<std::string, int> word_count;
while (std::getline(cin, word, ' ')) {
word_count[word]++;
}
typedef std::map<std::string, int>::iterator iter;
iter end = word_count.end();
for(iter it = word_count.begin(); it != end; ++it) {
cout << it->first << ", count= " << it->second << endl;
}
return 0;
}
我认为您应该将 2 个 std::set 与一些“1 次使用的单词”和“禁止的单词:使用两次或更多次”一起使用。
所以你处理了一个词:cur_word。如果forbidden_words 包含它,则忽略它,否则检查allowed_words 是否包含,将其删除并添加到forbidden_words,否则只需添加它do allowed_words。
std::unordered_set
可能比std::set
(尤其是在文件很大的情况下)更快。
不过,这不太可能有太大的不同——除非你写得非常糟糕,否则这项工作将受到严重的 I/O 限制,所以你的大部分工作应该放在加速 I/O 上。
如何从那里开始可能取决于目标操作系统。对于 Linux,快速文件读取主要等同于mmap
. 对于 Windows,您通常希望避免使用内存映射文件,并ReadFile
与FILE_FLAG_NO_BUFFERING
标志一起使用。