我要做的是从文本文件中读取一行,将其分解为组成它的单词,然后根据我不想要的“坏词”列表检查每个单词哈希值。不在坏词列表中的每个“好词”应该被散列并且将整行存储在其索引处(如果这是有意义的话)。因此,例如,“Ring of Fire”将分为“Ring”,“of of”和“Fire”。我会哈希“戒指”并用它存储“火环”,我会看到“of”并注意到它是一个坏词并跳过它,最后我会哈希“火”并用它存储“火环”同样。
我的代码将一行分为单词,将其与不良单词进行比较,并显示所有好单词。然后它关闭文件,重新打开它,并显示所有行。我在概念化方面遇到的问题是如何将两者结合起来同时散列所有好词和整行,以便我可以轻松地存储它们。我应该怎么做呢?
#include <cstring>
#include <cctype>
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
const char * bad_words[] = {"of", "the", "a", "for", "to", "in", "it", "on", "and"};
ifstream file;
file.open("songs.txt");
//if(!file.is_open()) return;
char word[50];
while(file >> word)
{
// if word == bad word, dont hash
// else hash and store it in my hash table
bool badword = false;
for(int i = 0; i < 9; ++i)
{
if(strcmp(word, bad_words[i]) == 0)
{
badword = true;
}
}
if(badword) continue;
else
{
// get all words in a line that are not in bad_words
char * good_word = new char[strlen(word)+1];
strcpy(good_word, word);
cout << good_word << endl; // testing to see if works
// hash each good_word, store good_line in both of them
//int index = Hash(good_word);
//Add(good_line) @ table[index];
}
}
file.close();
file.open("songs.txt");
while(!file.eof()) // go through file, grab each whole line. store it under the hash of good_word (above)
{
char line[50];
file.getline(line, 50, '\n');
char * good_line = new char[strlen(line)+1];
strcpy(good_line, line);
cout << good_line << endl; // testing to see if works
}
return 0;
}
答案 0 :(得分:0)
您似乎在寻找std::unordered_multimap
。
我可能也会对那些&#34;坏&#34;单词,并使用std::binary_search
查看它是否包含特定单词。
std::vector<std::string> bad { "a", "and", "for" /* ... keep sorted */};
std::unordered_multimap<std::string, std::string> index;
while (std::getline(infile, line)) {
std::istringstream buf(line);
std::string word;
while (buf >> word)
if (!binary_search(bad.begin(), bad.end(), word))
index.insert(std::make_pair(word, line));
}
答案 1 :(得分:0)
如果你真的必须实现自己的哈希表,你可以找到哈希表数据结构here的描述。
最简单的形式是,哈希表是链表的数组。该数组使用hascode%arraySize进行索引,链接列表负责散列冲突。