使用C ++计算字符串中字母数字字数量的最有效方法

时间:2017-01-02 22:02:09

标签: c++

将一个词定义为任何连续的字母数字字符串。单词由任何非字母数字解析。实施例

“嗨我的名字@是@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;
}

1 个答案:

答案 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;
}