Wie kann ich über die Wörter einer Zeichenkette iterieren?

Ich versuche, über die Wörter einer Zeichenkette zu iterieren.

Es kann davon ausgegangen werden, dass die Zeichenfolge aus durch Leerzeichen getrennten Wörtern besteht.

Beachten Sie, dass ich nicht an C-String-Funktionen oder dieser Art von Zeichenmanipulation/Zugriff interessiert bin. Bitte geben Sie in Ihrer Antwort auch der Eleganz den Vorrang vor der Effizienz.

Die beste Lösung, die ich im Moment habe, ist:

#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);
}

Gibt es einen eleganteren Weg, dies zu tun?

Dies ist meine Lieblingsmethode, um durch eine Zeichenkette zu iterieren. Sie können pro Wort tun, was Sie wollen.

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

istringstream iss(line, istringstream::in);

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

Die STL verfügt noch nicht über eine solche Methode.

Sie können jedoch entweder die [strtok()][1] Funktion von C verwenden, indem Sie das [std::string::c_str()][2] Mitglied benutzen, oder Sie können Ihre eigene schreiben. Hier ist ein Codebeispiel, das ich nach einer schnellen Google-Suche gefunden habe ("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);
    }
}

Entnommen aus:

Wenn Sie Fragen zum Codebeispiel haben, hinterlassen Sie einen Kommentar und ich werde es erklären.

Und nur weil es kein typedef namens Iterator implementiert oder den `

Kommentare (10)

Die Verwendung von std::stringstream, wie Sie sie haben, funktioniert perfekt und macht genau das, was Sie wollten. Wenn Sie nur nach einer anderen Methode suchen, können Sie [std::find()][1]/[std::find_first_of()][2] und [std::string::substr()][3] verwenden.

Hier ist ein Beispiel:


#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 
Kommentare (1)