Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C++中创建用于字符串操作的哈希表_C++_Hash_Hashtable - Fatal编程技术网

在C++中创建用于字符串操作的哈希表

在C++中创建用于字符串操作的哈希表,c++,hash,hashtable,C++,Hash,Hashtable,我正在尝试处理文章或任何段落[每个字符串]的内容。首先,我将使用strtok转换为单词 之后,我想将每个单词都存储在哈希表中,因为我认为这是处理大数据的唯一最佳方式。在处理每个单词时,我希望存储每个单词的出现次数。最后,我想得到最长时间内出现的单词 无序映射存储具有键值的元素,并允许快速检索具有键值的元素。这可能对我有用 我对C++不太好,所以需要一些意见。 将整个contains存储在char*ch=文章内容中是继续或string::str的好方法?我只熟悉第一个。第二,在处理函数的过程中,我

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

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

无序映射存储具有键值的元素,并允许快速检索具有键值的元素。这可能对我有用

我对C++不太好,所以需要一些意见。 将整个contains存储在char*ch=文章内容中是继续或string::str的好方法?我只熟悉第一个。第二,在处理函数的过程中,我感到很复杂

将整个ContentString存储到无序的_映射中,然后如何创建哈希表,其中包含作为单词的元素,以及它的出现。然后我能得到最大发生率的单词吗

有没有其他C++函数可以帮助我做我想做的事。 使用字符串总是比较容易 单词可以用作键,也可以算作值。基于关键字的检索可以快速地从无序的_图中检索。获取具有最大计数的单词需要在整个地图上迭代。 你的问题是你需要2个索引。 考虑使用Booo::多索引创建容器中的2个索引。


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

没有一个标准的容器可以直接处理这个问题。由于第一个操作将频繁发生,而第二个操作仅发生一次,因此您应该选择最适合第一个操作的容器

std::map和std::无序_map都会很好

请尝试以下操作:

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

为了按频率顺序打印所有作品,您必须将其复制到另一个结构中,然后对其进行排序。或者在一次操作中完成。你可以把所有的东西都复制到

std::map<int, std::string>
然后把它打印出来

我想把每个单词都存储在哈希表中,因为我认为这是处理大数据的唯一最佳方式。在处理每个单词时,我希望存储每个单词的出现次数

这里有一些伪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";
}

如果您的文章位于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]++;
}
你不需要也不想要斯特托克。如果空格是 单词分隔符,只需使用>>读入字符串即可 达到理想的结果整个输入阶段将是:

std::unordered_map<std::string, int> counts;
std::string word;
while ( source >> word ) {
    ++ counts[word];
}
根据需求,您可能需要执行以下操作 在计算之前将单词转换为小写,或 从中去掉最后的标点符号,以便 单词都一样

对于按计数排序的访问,最简单的方法是复制 将映射的内容转换为std::vector并对其进行排序。别忘了你可以构造
来自两个迭代器的向量。所以这只是另外两行。

请不要使用strtok,它是邪恶的。如果文本很大,您应该尝试找到解决方案,在解析之前不需要将整个文本读入内存。动态解析会使它更高效。@Borgleader:谢谢,但是你认为你链接的实现会按照我的要求与strtok做相同的事情吗?@AdamSangala:是的,但是动态阅读pdf或web文档本身对我来说是个问题。所以现在要处理的是在内存中读取frmo文本!我不需要按顺序打印它们。我只需要跟max谈谈。如果大于1,则表示所有。那么在这种情况下,我需要对它进行排序吗?因为这需要额外的时间。你可以对最终的地图进行两次扫描,一次是确定最大计数,第二次是打印所有罪犯。这肯定比排序快。或者,您可以在解析时跟踪最大计数,避免其中一个过程。谢谢,我如何在while中打印每个单词的出现计数值?谢谢,我认为这将解决我的问题。但在这里,对于事件,我必须像typedef std::unordered_map occurrencess;一样声明它。当我只给出字符串时,它表示候选者需要两个参数。我必须处理文章的内容,其中的计数值应该自己获取,而这里我们必须手动获取。@Karimkhan在这种情况下,您可以使用std::getline,然后使用std::find_if或std::find_first_将行分解为单词。对于非常复杂的情况,甚至可以使用正则表达式。
while(ss >> twords)  //line 12
std::unordered_map<std::string, int> counts;
std::string word;
while ( source >> word ) {
    ++ counts[word];
}