C++ 如何在C++;
情况如下: 我使用以下方法将sting作为输入:C++ 如何在C++;,c++,string,dictionary,stl,C++,String,Dictionary,Stl,情况如下: 我使用以下方法将sting作为输入: string s; getline (cin , s); 现在我想填写一张类型的地图。此映射的键将是输入字符串的单个单词。该值将存储单词的频率 示例:输入字符串-“你好,我的名字是OP Hello World” 地图应该是这样的: 你好-2 My-1 名称-1 is-1 OP-1 世界-1 我知道的方法是使用字符串运算将字符串分割成一个单独的单词数组 有没有其他有效的方法将字符串拆分为单词数组,并用单词作为键填充地图 >你说你已经把你的字符串拆
string s;
getline (cin , s);
现在我想填写一张
类型的地图。此映射的键将是输入字符串的单个单词。该值将存储单词的频率
示例:输入字符串-“你好,我的名字是OP Hello World”
地图应该是这样的:
你好-2
My-1
名称-1
is-1
OP-1
世界-1
我知道的方法是使用字符串运算将字符串分割成一个单独的单词数组
有没有其他有效的方法将字符串拆分为单词数组,并用单词作为键填充地图 >你说你已经把你的字符串拆分了,但是你想找到更好的方法,所以这里是C++中最优雅的字符串分割方法,假设你的单词与空白区分开。p> 现在您有了单词,获取单词并使用循环迭代所有单词,并在循环中使用以下命令:
WhateverYourMapName[WhateverTheCurrentWordIs]++代码>
此语句将现有关键字(单词)的值增加1或如果找不到新关键字(单词),将添加一个初始值为1
的新关键字(单词),使用strtok分割空白并迭代单词,
通过查找单词并将其分配到地图中或更改其值来检查每个单词是否在地图中。如果您有一个函数用于根据分隔符将std::string
对象拆分为字符串数组,那么您的任务实际上相当简单:
std::vector<std::string> lines;
std::string line;
while(std::getline(std::cin, line)) lines.emplace_back(line);
std::map<std::string, int> word_map;
for(const std::string & line : lines_of_input) {
//my_split_method can either be a standard library function, if one exists, or a function you've written yourself
std::vector<std::string> words = my_split_method(line);
for(const std::string & word : words) {
word_map[word]++;
}
}
for(const auto & word_pair : word_map) {
std::cout << "Frequency of \"" << word_pair.first << "\" is " << word_pair.second << std::endl;
}
std::矢量线;
std::字符串行;
而(std::getline(std::cin,line))行;
std::map word\u map;
for(常量标准::字符串和行:输入的行){
//my_split_方法可以是标准库函数(如果存在的话),也可以是您自己编写的函数
std::vector words=my\u split\u方法(行);
for(const std::string和word:words){
单词映射[单词]+;
}
}
for(常量自动和单词对:单词映射){
标准::cout
您需要将输入字符串拆分为子字符串
查找输入字符串中每个子字符串的出现次数
将子字符串存储为键,并在映射中作为值进行计数
假设输入是以空格分隔的,只需一次读一个单词并将其添加到地图中。如果这不是您需要的,也许您可以澄清您的问题。您所写的问题并不清楚。如果您使用std::string
作为键,那么int
存储了什么?该单词出现的次数计数?或单词第一次出现的顺序?您需要提供更多信息。按照u建议进行了更改all@FirstStep你可能在这方面是对的。我相信有很多好的库,人们可以推荐使用不同的分隔符、字符集、语言等来处理字符串拆分。不过,是的,我非常确定这是正确的因为过于基于意见而关闭。所以通常避免“推荐X”问题。但是,CodeReview也不是这样一个问题的合适位置。在这两种情况下,代码都是需要的,而不仅仅是对其他建议代码的想法。@SnakeEyes您仍然缺少。如果这个答案有问题,那么首先,我并不是否决你答案的那个人,其次,问题是把一个字符串拆分成一个组成单词的数组。@Snakeyes从你的帖子中写道:“我知道的方法是用字符串运算把字符串拆分成一个独立单词的数组。”意味着你已经有了允许你这么做的算法。不是这样吗?@snakeyes定义“单词”.用空格分隔?连字符?em破折号?其他什么?哪些字符应该也不应该被视为单词的一部分?@下划线\u d用空格分隔strtok
是一个C函数,用于销毁,嗯,我的意思是拆分以null结尾的字符
数组。它在那里不太受欢迎。但是,它完全不相关对于C++,使用<代码> STD::String 。它确实不能工作。即使在某种程度上,C语言中处理原始字符串的纯粹笨拙和经常危险是为什么 STD::String 在C++中存在。因此,无论是在技术上还是在良好的C++哲学方面,这个答案都是错误的。关于未定义的行为。C++17可能会将此更改为仅对非常量
数据
方法无效。我得到了不同的答案,但您的答案也是正确的!@snakeyes:很高兴我能帮上忙。
int main()
{
std::string input="Hello My name is OP Hello World";
std::map<std::string, int> myMap;
std::istringstream iss(input);
while (iss) {
std::string substr;
std::getline(iss,substr,' ');
int count = 0;
auto pos = input.find(substr, 0);
while (pos != std::string::npos) {
++count;
pos = input.find(substr, pos + 1);
}
if(substr.size() != 0)
myMap[substr] = count;
}
for (const auto &p : myMap) {
std::cout << p.first << "=" << p.second << '\n';
}
return 0;
}
Hello=2
My=1
OP=1
World=1
is=1
name=1