使用STL Map&设置重新出现的单词

时间:2016-09-27 16:31:20

标签: c++ dictionary iterator set

我目前正在开发一个程序,该程序将接收文本文件,并将每个单词组织成自己的值,并与其发生的次数配对。我一直在玩这个想法很长一段时间,无法超越基本的实现。我对使用MAP和SET非常新,我理解SET只会保存每个单词的一次出现,MAP可以使用单词本身作为键,它的数据类型可以是重复的次数。但是,要做到这一点,我很失落。我的代码是不完整的,我被困住,我试图做的是找出一种方法来存储SET中的每个单词,并立即将单词映射到一个原始值为一个地图,但是,如果一个单词重复,那么该集合将捕获它并将MAP KEY - VALUE对增加一个。

示例:

#include <iostream>
#include <vector>
#include <map>
#include <set>
using namespace std;

int main()
{
    map<string, int> testMap;
    vector<string> text;
    set<string> words;
    int datVal = 1;

    text.push_back("Hi");
    text.push_back("Hi");
    text.push_back("Bye");
    text.push_back("test");
    text.push_back("ice");
    text.push_back("pie");
    text.push_back("pie");
    text.push_back("cheese");
    text.push_back("wampum");

    for(int x = 0; x < text.size(); x++)
    {
    words.insert(text[x]);
    if(
    testMap.insert(make_pair(text[x], datVal)).second;

    }

如果有人能帮助我,我将非常感激!我甚至不懂如何检查设置并增加与地图相关的值,我还有很多东西需要学习。谢谢你的时间!

1 个答案:

答案 0 :(得分:1)

假设我们有std::vector<std::string>包含您的文字数据。如果我们想要在这个向量中创建单词的直方图,那么使用单std::map<std::string, unsigned int>通过使用std::map::operator[]探测地图实例来简单有效,https://netsuite.custhelp.com/app/answers/detail/a_id/59331/kw/nlapiGetContext访问对应于它们对应的值的引用如果数据尚未包含在地图中,则插入此方法:

int main() {
    std::vector<std::string> words; // populated somewhere
    std::map<std::string, unsigned int> word_histogram; // store word with associated count
    for (const auto& word : words) ++word_histogram[word]; // find word and increment count
}

这导致std::vector个单词中包含的单词的直方图。请注意,如果您不关心word_histogram中项目的排序,请使用std::unordered_map<std::string, unsigned int>,因为std::unordered_map::operator[]的平均大小写复杂度是常量,而在容器大小中则是对数std::map::operator[]

根据您在问题开头提到的要求,无需使用额外的std::set,只需使用上述代码即可实现。