Splitting string in einen vector<string> Wörter
Vom Accelerated C++(Buch), fand ich diesen code, das identisch ist mit dem Programm, aber verarbeitet im Programm selbst ist anders, und das verwirrt mich an einigen Teil.
Den code unten gut, natürlich wird es die Ausgabe jedes Wort einzeln(durch Schleifen), basierend auf Benutzereingaben, nachdem der Benutzer das Ende der Datei, dann das Programm beenden.
int main()
{
string s;
while (cin >> s)
cout << s << endl;
return 0;
}
Im Gegensatz zu den obigen code, dieser speichert jedes Wort in einem vector
, dann verwenden Sie einen index i
und j
zu erkennen, die nicht-whitespace-Zeichen, und die eigentliche Frage ist, ich verstehe nicht, wie es passiert mit dem vector.
Was ist ein Leerraum in vector
? Ein element?
Zuerst dachte ich, geht das Programm durch die einzelnen Charakter, weil ich dachte, die whitespace-Zeichen sind Zeichen(die i
und j
Funktionalität ist), dann das Buch und sagte, es gehen Sie durch die einzelnen Wort, ich weiß nicht, wie um dies zu testen mich, wie ich sehen kann, wie der innere Prozess, in den der compiler selbst bestimmt werden.
vector<string> split(const string& s)
{
vector<string> ret;
typedef string::size_type string_size;
string_size i = 0;
//invariant: we have processed characters [original value of i, i)
while (i != s.size())
{
//ignore leading blanks
//invariant: characters in range [original i, current i) are all spaces
while (i != s.size() && isspace(s[i]))
++i;
//find end of next word
string_size j = i;
//invariant: none of the characters in range [original j, current j)is a space
while (j != s.size() && !isspace(s[j]))
j++;
//if we found some nonwhitespace characters
if (i != j) {
//copy from s starting at i and taking j - i chars
ret.push_back(s.substr(i, j - i));
i = j;
}
}
return ret;
}
int main() {
string s;
//read and split each line of input
while (getline(cin, s)) {
vector<string> v = split(s);
//write each word in v
for (vector<string>::size_type i = 0; i != v.size(); ++i)
cout << v[i] << endl;
}
return 0;
}
- Du bist fehlen einige Klammern (
{
,}
) in Ihrem code. - gut, dass ich es einfach kopieren aus dem Buch
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den code, den Sie oben gepostet hat nicht teilen Sie eine Linie von text in Wörter, basierend auf Leerzeichen, stattdessen teilt eine Zeile in Zeichen. Aber wenn der code war tatsächlich kompilierbar und nicht fehlen alle notwendigen Klammern (
{
,}
). EDIT: Eigentlich, ob es spaltet Wörter oder einzelne Zeichen hängt davon ab, wo die Klammern gehen, untere Linie ist, dass der code nicht kompilieren.Hier ist eine korrigierte version des Codes, teilt jede Wort, anstatt jedes Charakter, einfach durch bewegen des letzten
if
Anweisung insplit
außerhalb der unmittelbarenwhile
block:Was passiert mit den
string
übergebensplit
ist:while (i != s.size())
)while (i != s.size() && isspace(s[i]))
++i
)string_size j = i
)while (j != s.size() && !isspace(s[j]))
)j++
)if (i != j)
)s.substr(i, j - i)
), und fügen Sie das Wort zumvector
(ret.push_back(..)
).vector
.Wenn Sie nur aufteilen, basierend auf den Raum, dann brauchen Sie nicht, schreiben Sie eine benutzerdefinierte Methode. STL hat Optionen für Sie.
std::copy(std::istream_iterator<std::string>(s), std::istream_iterator<std::string>(), std::back_inserter(strings))
ähnlich wie displaystd::copy(strings.begin(), strings.end(), std::ostream_iterator<std::string>(std::cout, std::endl))