Wie kann ich durch einen String iterieren und kenne den Index (aktuelle Position)?
Oft beim iterieren durch eine Zeichenkette (oder jede aufzählbare Objekt), wir sind nicht nur daran interessiert, den aktuellen Wert, sondern auch die position (index). Um dies zu erreichen, indem Sie mit string::iterator
wir pflegen einen separaten index:
string str ("Test string");
string::iterator it;
int index = 0;
for ( it = str.begin() ; it < str.end(); it++ ,index++)
{
cout << index << *it;
}
Oben Stil scheint nicht scheinen, überlegen die 'c-style'
string str ("Test string");
for ( int i = 0 ; i < str.length(); i++)
{
cout << i << str[i] ;
}
In Ruby können wir sowohl Inhalt und index in einer eleganten Art und Weise:
"hello".split("").each_with_index {|c, i| puts "#{i} , #{c}" }
Also, was ist die beste Praxis in C++ - Durchlaufen ein aufzählbares Objekt und behalten auch die übersicht über den aktuellen index?
InformationsquelleAutor der Frage pierrotlefou | 2009-08-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich habe noch nie gehört, eine beste Methode für diese spezifische Frage. Jedoch, eine bewährte Methode im Allgemeinen ist die einfachste Lösung, die das problem löst. In diesem Fall wird der array-style-Zugang (oder im c-Stil, wenn Sie es nennen wollen,) ist der einfachste Weg zu Durchlaufen, während der index-Wert zur Verfügung. So würde ich sicherlich empfehlen, dass Art und Weise.
InformationsquelleAutor der Antwort TheUndeadFish
Wie diese:
InformationsquelleAutor der Antwort Leandro T. C. Melo
Können Sie standard-STL-Funktion Abstand wie schon erwähnt
Können, können Sie auch Zugriff auf string und einige andere Container mit der c-ähnlichen Schnittstelle:
InformationsquelleAutor der Antwort Andrew
Einer guten Praxis würde auf die Lesbarkeit, z.B.:
Oder:
Oder Ihr original:
Etc. Was ist am einfachsten und saubersten zu Ihnen.
Es ist nicht klar, es ist eine best practice, müssen Sie eine Zählervariable irgendwo. Die Frage scheint zu sein, ob hier definieren Sie, und wie es erhöht die gut funktioniert für Sie.
InformationsquelleAutor der Antwort Alex Reynolds
Ich würde es verwenden-str.begin()
In diesem speziellen Fall std::Distanz-und Betreiber - sind die gleichen. Aber, wenn der container wird sich ändern, um etwas, ohne random-access -, std::distance erhöht werden erste argument, bis es erreichen, zweiten, gibt somit die lineare Zeit-und Betreiber - wird nicht kompiliert.
Ich persönlich bevorzuge das zweite Verhalten - es ist besser, um benachrichtigt zu werden, wenn Sie-Algorithmus von O(n) wurde O(n^2)...
InformationsquelleAutor der Antwort maxim1000
Für Zeichenfolgen, die Sie verwenden können
string.c_str()
zurückgeben wird, Sie ein const char*, die behandelt werden kann wie ein array, Beispiel:InformationsquelleAutor der Antwort jscharf
Seit
std::distance
nur Konstante Zeit für random-access-Iteratoren, würde ich wahrscheinlich lieber explizite iterator-Arithmetik.Auch, da wir das schreiben von C++ - code hier, ich glaube, dass ein mehr C++ idiomatische Lösung vorzuziehen ist, die über einen C-Stil-Ansatz.
InformationsquelleAutor der Antwort user2015735