2017-01-02 3 views
-5

Lassen Sie ein Wort als eine Folge von aufeinanderfolgenden alphanumerischen Zeichen definiert werden. Wörter werden von beliebigen nicht alphanumerischen Zeichen analysiert. Ex.Der effizienteste Weg zum Zählen der Anzahl alphanumerischer Wörter innerhalb einer Zeichenfolge mit C++

„Hallo, mein erster Name @ ist @ Kevin :)“

Ausgang: 6

Ich weiß, würde einfach durch die Zeichenfolge ein mit for-Schleife gehen könnte, aber was der effizienteste Weg sein würde zurückkehren die richtige Ausgabe mit dem vollen Umfang der C++ 11-Bibliothek?

Meine aktuelle Iteration:

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

Es sei denn, Sie verwalten einige grundlegende Gesetze der Physik des Universums zu ändern, müssen Sie „einfach gehen durch die Zeichenfolge einer for-Schleife“ oder ein gleichwertiges Verfahren. Und eine Rose mit irgendeinem anderen Namen ... –

+0

Was lässt Sie denken, dass Sie vermeiden können, die Schnur zu durchlaufen? Und was noch wichtiger ist, was haben Sie versucht - profiliert und gefunden? – Nim

+0

C++ ist wirklich gut darin, über Strings zu iterieren. Das wird mit ziemlicher Sicherheit am schnellsten sein. Übrigens, gibt es wirklich eine Folge von 6 alphanumerischen Zeichen in dieser Zeichenfolge? –

Antwort

0

Meines Wissens gibt es keine spezifische Funktion in C++ Bibliothek, die Worte zählt, die ausschließlich aus alphanumerischen Zeichen. Zum Beispiel würde ein istream::iterator in Verbindung mit distance "Wörter" zählen, die durch Leerzeichen getrennt sind, aber würde he is aged 45 als 4 Wörter zählen. Man könnte auch an strtok oder reguläre Ausdrücke denken, aber der Overhead wäre viel (viel) mehr als eine einfache Schleife. Versuchen Sie zum Beispiel folgendes. Wenn Sie diese Methode nicht milliardenweise während der Programmausführung verwenden, sollte sie gut genug funktionieren. Wenn nicht, lass es mich wissen :-). Hier Sie gehen:

#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

Ich habe Isalnum() anstelle von Isalpha() oder Regex verwendet. "Wörter" wie Twenty1st hätten für 2 Wörter anstatt der benötigten 1 gezählt. Aber ansonsten funktioniert alles. – lyph

Verwandte Themen