C ++ String Inverse

C ++ String Inverse
Si la chaîne, "vwxyz", Est reproduit dans le nouvel ordre comme"zyxwv". Ensuite, la chaîne a été inversée. Malheureusement, une telle réversibilité directe n'est pas possible en C++. Cependant, il existe une solution de contournement classique pour inverser une chaîne en C++. Continuez à lire cet article au savoir-faire.

Une chaîne peut être créée de deux manières principales en C++. Une chaîne peut être créée comme un pointeur constant vers une séquence de caractères. Une chaîne peut également être créée en instanciant un objet String à partir de la classe String. Cet article traite des objets de chaîne instanciés à partir de la classe String. Cela signifie que la bibliothèque de chaînes doit être incluse afin d'exécuter les échantillons de code dans cet article.

Un objet String est une structure de données où la chaîne littérale est une liste. Chaque caractère est d'un élément de la liste. Et donc, une chaîne littérale peut être gérée comme un tableau d'éléments.

Cet article explique la solution de contournement classique pour inverser une chaîne en c++. Cela itère essentiellement la chaîne littérale, arrière. Avoir une connaissance sommaire de l'itération vers l'avant permet au lecteur de mieux comprendre l'itération inverse. Cet article traite des objets de chaîne instanciés à partir de la classe String.

Tout le code de chaîne pour ce tutoriel est écrit dans la fonction C ++ Main (), sauf indication contraire.

Contenu de l'article

  1. Itération de la chaîne vers l'avant
  2. Itération inversée de la chaîne
  3. String constante itération inverse
  4. Conclusion

Itération avancée

Un iterator est une classe de pointeur à partir de laquelle les objets Iterator peuvent être instanciés. Un objet Iterator peut être utilisé pour scanner des éléments de chaîne du début de la liste des chaînes à la fin de la liste des chaînes. La fonction de membre de la chaîne, begin (), renvoie un itérateur qui pointe vers le premier élément du littéral de la chaîne. Il peut être incrémenté jusqu'à ce qu'il atteigne, juste après le dernier élément de la chaîne. La fonction de membre de la chaîne, end (), renvoie un itérateur qui pointe juste après le dernier élément du littéral de la chaîne. Il peut être décrémenté jusqu'à ce qu'il atteigne, le dernier élément de la chaîne. Ces deux itérateurs sont considérés comme des itérateurs en avant, bien que le second itéère en arrière.

Pour un objet String avec le nom de la variable, STR, l'instruction suivante renverra un itérateur Begin:

String :: iterator p = str.commencer();

Ici, P est un itérateur de début. Un itérateur de fin peut être renvoyé par l'énoncé suivant:

String :: iterator q = str.fin();

Ici, Q est un itérateur final. P et Q ci-dessus sont du même type et peuvent même être échangés.

Le code suivant imprime tous les caractères de la chaîne, du début à la fin:

String str = 'v', 'w', 'x', 'y', 'z', '\ 0';
pour (String :: Iterator p = str.commencer(); p != str.fin(); p ++)
couter << *p << ";

couter << endl;

La sortie est:

v w x y z

'\ 0' ne doit pas être imprimé. Il est censé être là pour marquer la fin de la corde littérale. Notez comment l'itérateur de début a été obtenu. L'itération scanne la liste Sting du début à la fin, en comparant l'itérateur de chaque élément avec celui retourné par Str.commencer(); Après incréments. Lorsque l'itérateur retourné est celui juste après le dernier élément, itérer s'arrête. Un itérateur est incrémenté ou décrémenté de la même manière qu'un index est. L'expression, * P renvoie la valeur indiquée, par l'itérateur, P.

Le code suivant imprime les valeurs de la chaîne, du dernier caractère au premier caractère, en utilisant l'itérateur End:

String str = "vwxyz";
String :: iterator q = str.fin();
pour (q = --q; q> = str.commencer(); q--)
couter << *q << ";

couter << endl;

La sortie est:

z y x w v

Ceci est une inversion indirecte d'une chaîne. L'itérateur final pointe juste après la fin du littéral de la corde, et un tel point n'est pas un élément. Pour qu'il pointe vers le dernier élément, il doit être décrémenté. De là, l'itération peut reculer.

Pour cette raison, l'itérateur final a été déclaré en dehors de la boucle. La valeur initiale de l'itérateur dans la boucle pour. L'itérateur est décrémenté en étapes jusqu'à ce qu'il atteigne le premier élément comme indiqué par «Str.commencer()". C'est un moyen informel d'établir en arrière. C'est-à-dire qu'il s'agit d'un moyen informel d'inverser un vecteur (indirectement).

Changer le caractère d'un élément

L'objet String est une structure de données, où la chaîne littérale est d'une liste. La liste se compose d'éléments. Chaque élément a un caractère, et ce caractère est la valeur de l'élément. Les caractères sont également des valeurs de la chaîne. Le littéral de chaîne complet est la valeur de l'objet String.

Lorsque la déclaration de l'objet de chaîne n'est pas précédée de const (pour constante), la valeur de tout élément de la chaîne peut être modifiée. Illustration:

String str = "vwxyz";
String :: iterator q = str.fin();
Q--; Q--; Q--;
* q = 'a';
String :: iterator b = str.fin();
pour (b = --b; b> = str.commencer(); B--)
couter << *B << ";

couter << endl;

La sortie est:

z y a w v

"Q-; Q-; Q-;«A diminué l'itérateur final 3 fois pour pointer vers 'C'.

Lorsque la déclaration d'objet String est précédée par const, les caractères sont en lecture seule. Pour un tel code, l'itérateur retourné doit être const_iterator. Dans ce cas, le code ne compile pas. Le code suivant publiera un message d'erreur:

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

Itération inversée

L'itérateur utilisé avec itération inverse est reversé. Une autre fonction membre de la classe String est, Rend (), qui renvoie un itérateur qui pointe juste devant le premier élément de l'objet String. Pourtant, une autre fonction membre de la classe String est RBEGIN (), qui renvoie un itérateur qui pointe vers le dernier élément de l'objet String. Le code suivant illustre l'utilisation du revers retourné, lisant dans la direction avant, du premier élément au dernier élément:

String str = "vwxyz";
String :: Reverse_iterator p = str.déchirer();
pour (p = --p; p> = str.rbegin (); P--)
couter << *p << ";

couter << endl;

La sortie est:

v w x y z

Remarquez qu'avec le revers_iterator, ++ est - et =, dans la condition While.

Le code suivant itère vers l'arrière, en utilisant l'itérateur de rBegin ():

String str = "vwxyz";
for (String :: reverse_iterator q = str.rbegin (); q <= str.rend(); q++)
couter << *q << ";

couter << endl;

La sortie est:

z y x w v

Encore une fois, ++ est utilisé à la place - et = = .

Changer le caractère d'un élément

Lorsque la déclaration de l'objet de chaîne n'est pas précédée de const (pour constante), la valeur de tout élément de la chaîne peut être modifiée. Illustration:

String str = "vwxyz";
String :: reverse_iterator q = str.rbegin ();
q ++; q ++;
* q = 'a';
for (String :: reverse_iterator b = str.rbegin (); B <= str.rend(); B++)
couter << *B << ";

couter << endl;

La sortie est:

z y a w v

L'itérateur RBEGIN (), Q, est décrémenté deux fois avec «Q ++; q ++; " Pour pointer du «C», car il pointe initialement le dernier élément.

Si un objet String est précédé de const, alors aucun des caractères ne peut être modifié avec n'importe quel type d'itérateur. Le compilateur émettra un message d'erreur pour le code suivant car le code essaie de modifier la valeur de «C»:

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

String constante itération inverse

Un const_reverse_iterator est renvoyé par la fonction membre, crbegin (). crbegin () est comme rbegin (), mais la valeur indiquée par son itérateur ne peut pas être modifiée. Un const_reverse_iterator est également renvoyé par une autre fonction membre, Crend (). CREND () est comme Rend (), mais la valeur indiquée par son itérateur ne peut pas être modifiée.

Le code suivant affiche toutes les valeurs de l'objet String, en utilisant const_reverse_iterator, à partir du dernier élément:

const string str = "vwxyz";
pour (String :: const_reverse_iterator q = str.crbegin (); q <= str.crend(); q++)
couter << *q << ";

couter << endl;

La sortie est:

z y x w v

Bien que la déclaration de l'objet de chaîne ne soit pas précédée de const, le code suivant ne compile pas. Cela est dû à l'utilisation de const_reverse_iterator. Même si la déclaration était précédée par const, elle ne compilera toujours pas pour la même raison. Le code est:

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

Conclusion

La classe String n'a pas de fonction de membre pour inverser une chaîne. Cependant, une chaîne peut être inversée indirectement en itérant de dos à l'avant. Les fonctions membres impliquées sont, end (), begin (), rend (), rbegin (), crend ​​() et crbegin (). Les itérateurs impliqués sont itérateurs, reverse_iterator et const_reverse_iterator. Ces fonctionnalités sont combinées pour produire un renversement indirect mais toujours efficace du littéral d'un objet de chaîne.