我目前正在开发一个程序,该程序将接收文本文件,并将每个单词组织成自己的值,并与其发生的次数配对。我一直在玩这个想法很长一段时间,无法超越基本的实现。我对使用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;
}
如果有人能帮助我,我将非常感激!我甚至不懂如何检查设置并增加与地图相关的值,我还有很多东西需要学习。谢谢你的时间!
答案 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
,只需使用上述代码即可实现。