2017-01-02 8 views
-5

単語を連続する英数字の文字列として定義します。単語は、英数字以外の文字で解析されます。 Ex。C++を使用して文字列内の英数字の数を最も効率的にカウントする方法

「こんにちは、私の第一名@ケビン@です:)」

出力

: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

、あなたは「単にforループを使用して文字列を通過する」、または同等のプロセスなければなりません。そして、他の名前でバラ... –

+0

あなたは文字列を通して反復を避けることができると思いますか?さらに重要なことは、あなたが試したことは何ですか? – Nim

+0

C++は文字列を反復処理するのに本当に良いです。それはほとんど確実に最速になるでしょう。ちなみに、その文字列には実際には6つの英数字のシーケンスがありますか? –

答えて

0

私の知る限りでは、単に英数字からなる単語を数えるC++ライブラリには特定の機能がありません。たとえば、istream::iteratordistanceを組み合わせると、空白で区切られた「単語」はカウントされますが、he is aged 45は4ワードとカウントされます。 strtokや正規表現についても考えることができますが、オーバーヘッドは単純なループよりはるかに多いでしょう。たとえば、次のように試してみてください。プログラムの実行中にこのメソッドを何十回も使用しない限り、十分に優れたパフォーマンスを発揮します。そうでない場合は、私に知らせてください:-)。ここ あなたが行く:あなたはこの宇宙の物理学のいくつかの基本的な法律を変更するために管理しなければ

#include <iostream> 

int main() 
{ 
    string line = "Hi my 1st [email protected]@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 [email protected]@Kevin :)' contains 6 words 
    return 0; 
} 
+0

私はisalpha()またはregexの代わりにisalnum()を使用しました。 twenty1stのような "Words"は、必要な1の代わりに2つの単語を数えることになりました。 – lyph

関連する問題