我正在阅读文本文件并将这些单词解析为地图,以计算每行上每个单词的出现次数。我需要忽略除撇号之外的所有非字母字符(标点符号,数字,空格等)。我可以弄清楚如何使用以下代码删除所有这些字符,但这会导致错误的单词,例如" one-two"出现在" onetwo",应该是两个单词," one"和"两个"。
相反,我现在尝试用空格替换所有这些值,而不是简单地删除,但无法弄清楚如何执行此操作。我认为replace-if算法是一个很好的算法,但是不能找到完成这个的正确语法。 C ++ 11很好。有什么建议吗?
示例输出如下:
"first second" = "first" and "second"
"one-two" = "one" and "two"
"last.First" = "last" and "first"
"you're" = "you're"
"great! A" = "great" and "A"
// What I initially used to delete non-alpha and white space (apostrophe's not working currently, though)
// Read file one line at a time
while (getline(text, line)){
istringstream iss(line);
// Parse line on white space, storing values into tokens map
while (iss >> word){
word.erase(remove_if(word.begin(), word.end(), my_predicate), word.end());
++tokens[word][linenum];
}
++linenum;
}
bool my_predicate(char c){
return c == '\'' || !isalpha(c); // This line's not working properly for apostrophe's yet
}
答案 0 :(得分:2)
bool my_predicate(char c){
return c == '\'' || !isalpha(c);
}
如果它和撇号,或者它不是是按字母顺序排列的字符,那么你写下你要删除的字符。
由于您要替换这些内容,因此应使用std::replace_if()
:
std::replace_if(std::begin(word), std::end(word), my_predicate, ' ');
你也应该纠正你的谓词:
return !isalpha(c) && c != '\'';
答案 1 :(得分:1)
您可以使用std::replace_if
预先处理输入行,然后再将其发送到istringstream。这也将简化你的内循环。
while (getline(text, line)){
replace_if(line.begin(), line.end(), my_predicate, ' ');
istringstream iss(line);
// Parse line on white space, storing values into tokens map
while (iss >> word){
++tokens[word][linenum];
}
++linenum;
}