42 votes

Un moyen efficace de vérifier si std::string n'a que des espaces

Je parlais juste avec un ami de ce qui serait le moyen le plus efficace de vérifier si un std::string n'a que des espaces. Il doit le faire sur un projet embarqué sur lequel il travaille et apparemment ce type d'optimisation compte pour lui.

J'ai trouvé le code suivant, il utilise strtok() .

 bool has_only_spaces(std::string& str)
{
    char* token = strtok(const_cast<char*>(str.c_str()), " ");

    while (token != NULL)
    {   
        if (*token != ' ')
        {   
            return true;
        }   
    }   
    return false;
}

Je recherche des commentaires sur ce code et des moyens plus efficaces d'effectuer cette tâche sont également les bienvenus.

101voto

Mark B Points 60200
if(str.find_first_not_of(' ') != std::string::npos)
{
    // There's a non-space.
}

58voto

Michael Goldshteyn Points 24679

En C++11, l' all_of peut être utilisé :

 // Check if s consists only of whitespaces
bool whiteSpacesOnly = std::all_of(s.begin(),s.end(),isspace);

17voto

David Hammen Points 17912

Pourquoi tant de travail, tant de frappe ?

 bool has_only_spaces(const std::string& str) {
   return str.find_first_not_of (' ') == str.npos;
}

7voto

Tom Points 1089

Ne serait-il pas plus simple de faire :

 bool has_only_spaces(const std::string &str)
{
    for (std::string::const_iterator it = str.begin(); it != str.end(); ++it)
    {
        if (*it != ' ') return false;
    }
    return true;
}

Cela a l'avantage de revenir tôt dès qu'un caractère non espace est trouvé, ce sera donc légèrement plus efficace que les solutions qui examinent la chaîne entière.

5voto

ericcurtin Points 448

Pour vérifier si la chaîne n'a que des espaces en c++11 :

 bool is_whitespace(const std::string& s) {
  return std::all_of(s.begin(), s.end(), isspace);
}

en pré-c++11 :

 bool is_whitespace(const std::string& s) {
  for (std::string::const_iterator it = s.begin(); it != s.end(); ++it) {
    if (!isspace(*it)) {
      return false;
    }
  }
  return true;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X