Se puede crear una cadena de dos maneras principales en C++. Se puede crear una cadena como un puntero constante para una secuencia de caracteres. También se puede crear una cadena instanciando un objeto de cadena desde la clase de cadena. Este artículo trata con objetos de cadena instanciados desde la clase de cadena. Esto significa que la biblioteca de cadenas debe incluirse para ejecutar las muestras de código en este artículo.
Un objeto de cadena es una estructura de datos donde la cadena literal es una lista. Cada personaje es de un elemento en la lista. Y así, una cadena literal se puede manejar como una variedad de elementos.
Este artículo explica la solución clásica para revertir una cadena en C++. Esto esencialmente itera la cadena literal, hacia atrás. Tener un conocimiento resumido de la iteración hacia adelante permite al lector comprender mejor la iteración inversa. Este artículo trata con objetos de cadena instanciados desde la clase de cadena.
Todo el código de cadena para este tutorial se escribe en la función C ++ Main () a menos que se indique lo contrario.
Contenido del artículo
Iteración hacia adelante
Un iterador es una clase de puntero desde la cual se pueden instanciar objetos iterador. Se puede usar un objeto iterador para escanear elementos de cadena desde el comienzo de la lista de cadenas hasta el final de la lista de cadenas. La función miembro de la cadena, begin (), devuelve un iterador que apunta al primer elemento del literal de cadena. Se puede incrementar hasta que alcanza, justo después del último elemento de la cadena. La función miembro de la cadena, end (), devuelve un iterador que apunta justo después del último elemento de la cadena literal. Se puede disminuir hasta que llegue, el último elemento de la cadena. Estos dos iteradores se consideran iteradores delanteros, aunque el segundo itera hacia atrás.
Para un objeto de cadena con el nombre de la variable, STR, la siguiente declaración devolverá un iterador BEGIN:
cadena :: iterator p = str.comenzar();
Aquí, P es un iterador de comienzo. Un iterador final puede ser devuelto mediante la siguiente declaración:
string :: iterator q = str.fin();
Aquí, Q es un iterador final. P y Q arriba son del mismo tipo e incluso se pueden intercambiar.
El siguiente código imprime todos los caracteres de la cadena, desde el principio hasta el final:
cadena str = 'v', 'w', 'x', 'y', 'z', '\ 0';
para (string :: iterator p = str.comenzar(); pag != STR.fin(); p ++)
cout << *p << ";
cout << endl;
La salida es:
V W X Y Z
'\ 0' no debe imprimirse. Se supone que debe estar allí para marcar el final de la cadena literal. Tenga en cuenta cómo se obtuvo el iterador de comienzo. La iteración escanea la lista de aguijones desde el principio hasta el final, comparando el iterador de cada elemento con el devuelto por STR.comenzar(); Después de incrementar. Cuando el iterador devuelto es el que justo después del último elemento, iterando se detiene. Un iterador se incrementa o disminuye de la misma manera que un índice está. La expresión, *p devuelve el valor apuntado a, por el iterador, p.
El siguiente código imprime los valores en la cadena, desde el último carácter hasta el primer carácter, usando el iterador final:
cadena str = "vwxyz";
string :: iterator q = str.fin();
para (q = --q; q> = str.comenzar(); q--)
cout << *q << ";
cout << endl;
La salida es:
z y x w v
Esta es una inversión indirecta de una cadena. El iterador final apunta justo después del final de la cadena literal, y tal punto no es un elemento. Para que apunte al último elemento, debe disminuir. A partir de ahí, la iteración puede retroceder.
Debido a eso, el iterador final fue declarado fuera del bucle. El valor inicial del iterador en el for-bucle es una sola disminución. El iterador se disminuye en los pasos hasta que alcanza el primer elemento como lo indica "STR.comenzar()". Esta es una forma informal de iterar hacia atrás. Es decir, esta es una forma informal de revertir un vector (indirectamente).
Cambiar el carácter de un elemento
El objeto de cadena es una estructura de datos, donde la cadena literal es de una lista. La lista consta de elementos. Cada elemento tiene un carácter, y ese carácter es el valor del elemento. Los caracteres también son valores de la cadena. La cadena completa literal es el valor del objeto de cadena.
Cuando la declaración del objeto de cadena no está precedida por const (para constante), el valor de cualquier elemento en la cadena se puede cambiar. Ilustración:
cadena str = "vwxyz";
string :: iterator q = str.fin();
Q--; Q--; Q--;
*q = 'a';
cadena :: iterator b = str.fin();
para (b = -b; b> = str.comenzar(); B--)
cout << *B << ";
cout << endl;
La salida es:
Z y A W V
"Q-; Q-; Q-;"Decrementó el iterador final 3 veces para señalar 'C'.
Cuando la declaración del objeto de cadena está precedida por const, los caracteres son de solo lectura. Para dicho código, el iterador devuelto debe ser const_iterator. En este caso, el código no se compila. El siguiente código emitirá un mensaje de error:
const string str = "vwxyz";
string :: const_iterator q = str.fin();
Q--; Q--; Q--;
*q = 'a';
Iteración inversa
El iterador utilizado con iteración inversa es reverse_iterator. Otra función miembro de la clase de cadena es, rend (), que devuelve un iterador que apunta justo en frente del primer elemento del objeto de cadena. Aún así, otra función miembro de la clase de cadena es rbegin (), que devuelve un iterador que apunta al último elemento del objeto de cadena. El siguiente código ilustra el uso del reverse_iterator devuelto, leyendo en la dirección de reenvío, desde el primer elemento hasta el último elemento:
cadena str = "vwxyz";
string :: reverse_iterator p = str.desgarrar();
para (p = - -p; p> = str.rbegin (); pag--)
cout << *p << ";
cout << endl;
La salida es:
V W X Y Z
Observe que con el reverse_iterator, ++ es - y =, en la condición mientras.
El siguiente código itera hacia atrás, usando el iterador de rbegin ()::
cadena str = "vwxyz";
for (string :: reverse_iterator q = str.rbegin (); Q <= str.rend(); q++)
cout << *q << ";
cout << endl;
La salida es:
z y x w v
Nuevamente, se usa ++ en lugar de - y = .
Cambiar el carácter de un elemento
Cuando la declaración del objeto de cadena no está precedida por const (para constante), el valor de cualquier elemento en la cadena se puede cambiar. Ilustración:
cadena str = "vwxyz";
string :: reverse_iterator q = str.rbegin ();
Q ++; Q ++;
*q = 'a';
for (string :: invers_iterator b = str.rbegin (); B <= str.rend(); B++)
cout << *B << ";
cout << endl;
La salida es:
Z y A W V
El iterador rbegin (), Q, se disminuye dos veces con "Q ++; Q ++; " apuntar en 'c', ya que inicialmente apunta al último elemento.
Si un objeto de cadena está precedido con const, entonces no de los caracteres se puede cambiar con cualquier tipo de iterador. El compilador emitirá un mensaje de error para el siguiente código porque el código intenta modificar el valor de 'C':
const string str = "vwxyz";
string :: const_reverse_iterator q = str.rbegin ();
Q ++; Q ++;
*q = 'a';
Cadena de iteración inversa constante
Un const_reverse_iterator es devuelto por la función miembro, CRBEGIN (). crbegin () es como rbegin (), pero el valor apuntado por su iterador no puede cambiarse. Un const_reverse_iterator también es devuelto por otra función miembro, crend (). crend () es como rend (), pero el valor apuntado a, por su iterador, no se puede cambiar.
El siguiente código muestra todos los valores del objeto de cadena, usando const_reverse_iterator, comenzando desde el último elemento:
const string str = "vwxyz";
for (string :: const_reverse_iterator q = str.crbegin (); Q <= str.crend(); q++)
cout << *q << ";
cout << endl;
La salida es:
z y x w v
Aunque la declaración del objeto de cadena no está precedida por const, el siguiente código no se compilará. Esto se debe al uso de const_reverse_iterator. Incluso si la declaración fuera precedida por const, aún no se compilaría por la misma razón. El código es:
const string str = "vwxyz";
string :: const_reverse_iterator q = str.crbegin ();
Q ++; Q ++;
*q = 'a';
Conclusión
La clase de cadena no tiene una función miembro para revertir una cadena. Sin embargo, una cadena se puede revertir indirectamente iterando de regreso a delante. Las funciones de miembro involucradas son, end (), begin (), rend (), rbegin (), crend () y crbegin (). Los iteradores involucrados son iterator, reverse_iterator y const_reverse_iterator. Estas características se combinan para producir una inversión indirecta pero aún efectiva del literal de un objeto de cadena.