将一个词定义为任何连续的字母数字字符串。单词由任何非字母数字解析。实施例
“嗨我的名字@是@Kevin :)”
输出:6
我知道可以简单地使用for循环遍历字符串但是使用c ++ 11库的完整范围返回正确输出的最有效方法是什么?
我目前的迭代:
int findWords(string line) {
regex AN("[[:alnum:]]");
int count = 0;
bool state = false;
for (char c : line) {
string s(1, c);
bool match = regex_match(s, AN);
if (match && !state) {
state = true;
}
else if (!match && state) {
count++;
state = false;
}
else {
continue;
}
}
if (state == true) { //won't count last word otherwise
count++;
}
return count;
}
答案 0 :(得分:0)
据我所知,c ++库中没有特定的功能可以计算仅由字母数字组成的单词。例如,与istream::iterator
结合的distance
会计算由空格分隔的“单词”,但会将he is aged 45
计为4个单词。人们也可以想到strtok
或正则表达式,但开销远远超过简单的循环。因此,请尝试以下方法。除非你在程序执行期间使用这种方法十亿次,否则它应该表现得足够好。如果没有,请告诉我:-)。
你走了:
#include <iostream>
int main()
{
string line = "Hi my 1st name@is@Kevin :)";
bool isInAlphaMode = false;
int count = 0;
const char* str = line.c_str();
while (char c = *str) {
if (isalpha(c) && !isInAlphaMode) {
count++;
isInAlphaMode = true;
}
else if (!isalpha(c) && isInAlphaMode) {
isInAlphaMode = false;
}
str++;
}
printf("string '%s' contains %d words", line.c_str(), count);
// output: string 'Hi my 1st name@is@Kevin :)' contains 6 words
return 0;
}