2017-01-02 1 views
-5

Пусть слово определяется как любая строка последовательных буквенно-цифровых символов. Слова анализируются любыми не буквенно-цифровыми. Ex.Самый эффективный способ подсчета количества буквенно-цифровых слов в строке с использованием C++

«Привет мой первый имя @ это @ Кевин :)»

выход: 6

Я знаю, что бы можно было просто пройти через строку, используя для цикла, но то, что будет наиболее эффективным способом, чтобы вернуться правильный выход, используя всю библиотеку 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

Что заставляет вас думать, что вы можете избежать повторения через строку? И что еще более важно, что вы пробовали - профилировали и нашли? – Nim

+0

C++ действительно хорош в итерации по строкам. Это почти наверняка будет самым быстрым. Кстати, действительно ли существует последовательность из 6 буквенно-цифровых символов в этой строке? –

ответ

0

Насколько мне известно, не существует никакой конкретной функции в библиотеке C++, которая подсчитывает слова, состоящие только из букв и цифр. Например, istream::iterator в сочетании с distance будет считать «слова» разделенными пробелами, но будет считать 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

Я использовал isalnum() вместо isalpha() или regex. «Слова», подобные двадцатью, были бы рассчитаны на 2 слова вместо нужного 1. Но кроме этого все работает. – lyph

Смежные вопросы