Comment itérer sur les mots d'une chaîne de caractères ?

J'essaie d'itérer sur les mots d'une chaîne de caractères.

On peut supposer que la chaîne est composée de mots séparés par des espaces.

Notez que je ne suis pas intéressé par les fonctions de chaîne en C ou par ce type de manipulation/accès aux caractères. Veuillez également privilégier l'élégance à l'efficacité dans votre réponse.

La meilleure solution que j'ai actuellement est la suivante :

#include <iostream>
#include <sstream>
#include <string>

using namespace std;

int main()
{
    string s = "Somewhere down the road";
    istringstream iss(s);

    do
    {
        string subs;
        iss >> subs;
        cout << "Substring: " << subs << endl;
    } while (iss);
}

Existe-t-il une manière plus élégante de procéder ?

C'est ma façon préférée d'itérer dans une chaîne de caractères. Vous pouvez faire ce que vous voulez par mot.

string line = "a line of text to iterate through";
string word;

istringstream iss(line, istringstream::in);

while( iss >> word )     
{
    // Do something on `word` here...
}
Commentaires (3)

La STL ne dispose pas encore d'une telle méthode.

Cependant, vous pouvez soit utiliser la fonction [strtok()][1] du C en utilisant le membre [std::string::c_str()][2], ou vous pouvez écrire votre propre méthode. Voici un exemple de code que j'ai trouvé après une recherche rapide sur Google ("STL string split ") :

void Tokenize(const string& str,
              vector& tokens,
              const string& delimiters = " ")
{
    // Skip delimiters at beginning.
    string::size_type lastPos = str.find_first_not_of(delimiters, 0);
    // Find first "non-delimiter".
    string::size_type pos     = str.find_first_of(delimiters, lastPos);

    while (string::npos != pos || string::npos != lastPos)
    {
        // Found a token, add it to the vector.
        tokens.push_back(str.substr(lastPos, pos - lastPos));
        // Skip delimiters.  Note the "not_of"
        lastPos = str.find_first_not_of(delimiters, pos);
        // Find next "non-delimiter"
        pos = str.find_first_of(delimiters, lastPos);
    }
}

Tiré de :

Si vous avez des questions sur l'exemple de code, laissez un commentaire et je vous expliquerai.

Et ce n'est pas parce qu'il n'implémente pas un typedef appelé iterator ou qu'il ne surcharge pas l'opérateur `

Commentaires (10)

Utiliser std::stringstream comme vous l'avez fait fonctionne parfaitement, et fait exactement ce que vous vouliez. Si vous cherchez une autre façon de faire les choses, vous pouvez utiliser [std::find()][1]/[std::find_first_of()][2] et [std::string::substr()][3].

Voici un exemple :


#include 
#include 

int main()
{
    std::string s("Somewhere down the road");
    std::string::size_type prev_pos = 0, pos = 0;

    while( (pos = s.find(' ', pos)) != std::string::npos )
    {
        std::string substring( s.substr(prev_pos, pos-prev_pos) );

        std::cout 
Commentaires (1)