C ++ String umgekehrt

C ++ String umgekehrt
Wenn die Zeichenfolge, “vwxyz"Wird in der neuen Ordnung reproduziert"zyxwv“. Dann wurde die Saite umgekehrt. Leider ist eine solche direkte Reversibilität in C nicht möglich++. Es gibt jedoch eine klassische Problemumgehung, um eine Schnur in C umzukehren++. Lesen Sie diesen Artikel weiter zum Know-how.

Eine Zeichenfolge kann auf zwei Hauptarten in C erstellt werden++. Eine Zeichenfolge kann als konstanter Zeiger auf eine Reihenfolge von Zeichen erstellt werden. Eine Zeichenfolge kann auch erstellt werden, indem ein String -Objekt aus der String -Klasse instanziiert wird. Dieser Artikel befasst sich mit String -Objekten, die aus der String -Klasse instanziiert sind. Dies bedeutet.

Ein String -Objekt ist eine Datenstruktur, in der das String -Literal eine Liste ist. Jedes Zeichen hat ein Element in der Liste. Und so kann eine wörtliche Schnur wie eine Reihe von Elementen behandelt werden.

Dieser Artikel erklärt die klassische Problemumgehung, um eine Zeichenfolge in C umzukehren++. Dies iteriert im Wesentlichen die Streicher buchstäblich, rückwärts. Durch ein zusammenfassendes Wissen über die Vorwärts -Iteration kann der Leser die rückläufige Iteration besser verstehen. Dieser Artikel befasst sich mit String -Objekten, die aus der String -Klasse instanziiert sind.

Der gesamte String -Code für dieses Tutorial ist in der Funktion c ++ main () geschrieben, sofern nicht anders angegeben.

Artikelinhalt

  1. String Forward Iteration
  2. String Reverse Iteration
  3. String Constant Reverse Iteration
  4. Abschluss

Vorwärts -Iteration

Ein Iterator ist eine Zeigerklasse, aus der Iteratorobjekte instanziiert werden können. Ein Iteratorobjekt kann verwendet werden, um Zeichenfolgenelemente vom Beginn der String -Liste bis zum Ende der String -Liste zu scannen. Die String -Mitgliedsfunktion begin () gibt einen Iterator zurück, der auf das erste Element des String -Literales verweist. Es kann inkrementiert werden, bis es erreicht, kurz nach dem letzten Element der Zeichenfolge. Die String -Mitgliedsfunktion End () gibt einen Iterator zurück, der kurz nach dem letzten Element des String -Literales zeigt. Es kann verringert werden, bis es erreicht wird, das letzte Element der Zeichenfolge. Diese beiden Iteratoren gelten als Forward -Iteratoren, obwohl der zweite rückwärts iteriert.

Für ein String -Objekt mit dem Variablennamen STR gibt die folgende Anweisung einen Iterator mit Beginn zurück:

String :: Iterator p = str.Start();

Hier ist P ein Iterator für Start. Ein End -Iterator kann durch die folgende Erklärung zurückgegeben werden:

String :: Iterator q = str.Ende();

Hier ist Q ein End -Iterator. P und Q oben sind vom gleichen Typ und können sogar austauscht werden.

Der folgende Code enthält alle Zeichen der Zeichenfolge vom Start bis zum Ende:

String str = 'v', 'w', 'x', 'y', 'z', '\ 0';
für (String :: Iterator p = str.Start(); P != str.Ende(); p ++)
Cout << *p << ";

Cout << endl;

Die Ausgabe ist:

V w x y z

'\ 0' sollte nicht gedruckt werden. Es soll da sein, um das Ende der Streicher wörtlich zu markieren. Beachten Sie, wie die Iteratorin des Beginns erhalten wurde. Die Iteration scannt die Stacheliste vom Anfang bis zum Ende und vergleicht den Iterator jedes Elements mit der von STR zurückgegeben.Start(); Nach dem Inkrementieren. Wenn der zurückgegebene Iterator kurz nach dem letzten Element derjenige ist, stoppt die Iteration auf. Ein Iterator ist inkrementiert oder dekrementiert auf die gleiche Weise, wie ein Index ist. Der Ausdruck, *p gibt den Wert zurück, auf den der Iterator p zeigt, P.

Der folgende Code ergibt die Werte in der Zeichenfolge vom letzten Zeichen zum ersten Zeichen mit dem End -Iterator:

String str = "vwxyz";
String :: Iterator q = str.Ende();
für (q = --q; q> = str.Start(); Q--)
Cout << *q << ";

Cout << endl;

Die Ausgabe ist:

z y x w v

Dies ist eine indirekte Umkehrung einer Schnur. Der End -Iterator zeigt kurz nach dem Ende des Saitenliterales, und ein solcher Punkt ist kein Element. Damit es auf das letzte Element hinweist, muss es dekrementiert werden. Von dort aus kann die Iteration rückwärts gehen.

Aus diesem Grund wurde der End-Iterator außerhalb der FORSCHLOOP erklärt. Der anfängliche Wert des Iterators in der For-Loop ist ein einzelner Dekrement. Der Iterator wird in Schritten abgeschlossen, bis er das erste Element erreicht, wie durch „Str.Start()". Dies ist eine informelle Art, rückwärts zu iterieren. Das heißt, dies ist eine informelle Möglichkeit, einen Vektor (indirekt) umzukehren.

Ändern des Charakters eines Elements

Das String -Objekt ist eine Datenstruktur, in der das String -Literal aus einer Liste steht. Die Liste besteht aus Elementen. Jedes Element hat ein Zeichen, und dieses Zeichen ist der Wert des Elements. Die Zeichen sind auch Werte der Zeichenfolge. Das vollständige String -Literal ist der Wert des String -Objekts.

Wenn der Deklaration des String -Objekts CONT (für Konstante) nicht vorausgeht, kann der Wert eines Elements in der Zeichenfolge geändert werden. Illustration:

String str = "vwxyz";
String :: Iterator q = str.Ende();
Q--; Q--; Q--;
*q = 'a';
String :: Iterator b = str.Ende();
für (b = - -b; b> = str.Start(); B--)
Cout << *B << ";

Cout << endl;

Die Ausgabe ist:

z y a w v

Q-; Q-; Q-;"Dekrementiert den End -Iterator dreimal, um auf 'C' zu verweisen".

Wenn der Deklaration der String-Objekte von const vorgegangen ist, sind die Zeichen schreibgeschützt. Für einen solchen Code muss der zurückgegebene Iterator Const_iterator sein. In diesem Fall kompiliert der Code nicht. Der folgende Code gibt eine Fehlermeldung aus:

const string str = "vwxyz";
String :: const_iterator q = str.Ende();
Q--; Q--; Q--;
*q = 'a';

Reverse Iteration

Der mit reverse Iteration verwendete Iterator ist Reverse_iterator. Eine weitere Mitgliedsfunktion der String -Klasse ist Rend (), die einen Iterator zurückgibt, der direkt vor dem ersten Element des String -Objekts zeigt. Eine weitere Mitgliedsfunktion der String -Klasse ist rbegin (), die einen Iterator zurückgibt, der auf das letzte Element des String -Objekts verweist. Der folgende Code zeigt die Verwendung des zurückgegebenen Reverse_iterators, der in der Vorwärtsrichtung vom ersten Element zum letzten Element liest:

String str = "vwxyz";
String :: Reverse_iterator p = str.zerreißen();
für (p = - -p; p> = str.rbegin (); P--)
Cout << *p << ";

Cout << endl;

Die Ausgabe ist:

V w x y z

Beachten Sie, dass ++ mit dem Reverse_iterator - und = in der Bedingung ist.

Der folgende Code iteriert nach hinten unter Verwendung des Iterators von rbegin ():

String str = "vwxyz";
für (String :: Reverse_iterator q = str.rbegin (); Q <= str.rend(); q++)
Cout << *q << ";

Cout << endl;

Die Ausgabe ist:

z y x w v

Auch hier wird ++ anstelle von - und = verwendet .

Ändern des Charakters eines Elements

Wenn der Deklaration des String -Objekts CONT (für Konstante) nicht vorausgeht, kann der Wert eines Elements in der Zeichenfolge geändert werden. Illustration:

String str = "vwxyz";
String :: Reverse_iterator q = str.rbegin ();
Q ++; Q ++;
*q = 'a';
für (String :: Reverse_iterator b = str.rbegin (); B <= str.rend(); B++)
Cout << *B << ";

Cout << endl;

Die Ausgabe ist:

z y a w v

Der iterator rbegin () q wird zweimal mit „q ++; Q ++; “ auf 'c' zu zeigen, da es zunächst auf das letzte Element hinweist.

Wenn ein String -Objekt bei Const vorgegangen ist, können keine der Zeichen mit jeder Art von Iterator geändert werden. Der Compiler gibt eine Fehlermeldung für den folgenden Code aus, da der Code versucht, den Wert von 'C' zu ändern:

const string str = "vwxyz";
String :: const_reverse_iterator q = Str.rbegin ();
Q ++; Q ++;
*q = 'a';

String Constant Reverse Iteration

Ein const_reverse_iterator wird von der Mitgliedsfunktion, crbegin () zurückgegeben. crbegin () ist wie rbegin (), aber der von seinem Iterator hervorgehobene Wert kann nicht geändert werden. Ein const_reverse_iterator wird ebenfalls von einer anderen Mitgliedsfunktion zurückgegeben, Crend (). crend ​​() ist wie rend (), aber der Wert wies von seiner Iterator nicht geändert werden kann.

Der folgende Code zeigt alle Werte des String -Objekts mit const_reverse_iterator an, beginnend mit dem letzten Element:

const string str = "vwxyz";
für (string :: const_reverse_iterator q = str.crbegin (); Q <= str.crend(); q++)
Cout << *q << ";

Cout << endl;

Die Ausgabe ist:

z y x w v

Obwohl der Deklaration des String -Objekts von CONT nicht vorgegangen ist, wird der folgende Code nicht kompiliert. Dies liegt an der Verwendung von const_reverse_iterator. Selbst wenn der Erklärung von const vorangestellt würde, würde sie aus dem gleichen Grund nicht kompilieren. Der Code ist:

const string str = "vwxyz";
String :: const_reverse_iterator q = Str.crbegin ();
Q ++; Q ++;
*q = 'a';

Abschluss

Die String -Klasse hat keine Mitgliedsfunktion, um eine Zeichenfolge umzukehren. Eine Saite kann jedoch indirekt umgekehrt werden, indem von hinten nach vorne Iteration iteriert wird. Die beteiligten Mitgliedsfunktionen sind, end (), begin (), rend (), rbegin (), crend ​​() und crbegin (). Die beteiligten Iteratoren sind Iterator, Reverse_iterator und const_reverse_iterator. Diese Merkmale werden kombiniert, um eine indirekte, aber dennoch wirksame Umkehrung des wörtlichen Streichelobjekts zu erzeugen.