Uma string pode ser criada de duas maneiras principais em C++. Uma string pode ser criada como um ponteiro constante para uma sequência de caracteres. Uma string também pode ser criada instanciando um objeto de string da classe String. Este artigo lida com objetos de string instanciados da classe String. Isso significa que a biblioteca de string deve ser incluída para executar as amostras de código neste artigo.
Um objeto String é uma estrutura de dados em que a string literal é uma lista. Cada personagem é de um elemento na lista. E assim, uma corda literal pode ser tratada como uma variedade de elementos.
Este artigo explica a solução alternativa clássica para reverter uma string em c++. Isso essencialmente itera a corda literal, para trás. Ter um conhecimento resumido da iteração avançada permite ao leitor entender melhor a iteração reversa. Este artigo lida com objetos de string instanciados da classe String.
Todo o código da string para este tutorial é escrito na função C ++ main (), a menos que indicado de outra forma.
Conteúdo do artigo
Iteração avançada
Um iterador é uma classe de ponteiro da qual os objetos do iterador podem ser instanciados. Um objeto iterador pode ser usado para digitalizar elementos da string desde o início da lista de strings até o final da lista de strings. A função do membro da string, BEGIN (), retorna um iterador que aponta para o primeiro elemento da string literal. Pode ser incrementado até chegar, logo após o último elemento da string. A função do membro da string, end (), retorna um iterador que aponta logo após o último elemento da string literal. Pode ser diminuído até chegar, o último elemento da string. Esses dois iteradores são considerados iteradores avançados, embora o segundo itera para trás.
Para um objeto String com o nome da variável, STR, a seguinte declaração retornará um iterador de início:
string :: iterator p = str.começar();
Aqui, P é um iterador de início. Um iterador final pode ser devolvido pela seguinte declaração:
string :: iterator q = str.fim();
Aqui, Q é um iterador final. P e Q acima são do mesmo tipo e podem até ser trocados.
O código a seguir imprime todos os caracteres da string, desde o início ao final:
string str = 'v', 'w', 'x', 'y', 'z', '\ 0';
para (string :: iterator p = str.começar(); p != str.fim(); p ++)
cout << *p << ";
cout << endl;
A saída é:
V W x y Z
'\ 0' não deve ser impresso. Deve estar lá para marcar o fim da corda literal. Observe como o iterador de início foi obtido. A iteração examina a lista de picadas do início ao fim, comparando o iterador de cada elemento com o retornado por STR.começar(); Após o incremento. Quando o iterador devolvido é o logo após o último elemento, paradas de iteração. Um iterador é incrementado ou decrescente da mesma maneira que um índice é. A expressão, *P retorna o valor apontado para, pelo iterador, p.
O código a seguir imprime os valores na string, desde o último caractere até o primeiro caractere, usando o iterador final:
string str = "vwxyz";
string :: iterator q = str.fim();
para (q = --q; q> = str.começar(); Q--)
cout << *q << ";
cout << endl;
A saída é:
z y x w v
Esta é uma reversão indireta de uma corda. O final do iterador aponta logo após o final da corda literal, e esse ponto não é um elemento. Para que aponte para o último elemento, ele deve ser diminuído. A partir daí, a iteração pode voltar para trás.
Por causa disso, o iterador final foi declarado fora do loop for. O valor inicial do iterador no loop for um único decréscimo. O iterador está diminuído nas etapas até atingir o primeiro elemento, conforme indicado por “STR.começar()". Esta é uma maneira informal de iterar para trás. Isto é, esta é uma maneira informal de reverter um vetor (indiretamente).
Mudança de caráter de um elemento
O objeto String é uma estrutura de dados, onde a string literal é de uma lista. A lista consiste em elementos. Cada elemento tem um personagem, e esse personagem é o valor do elemento. Os caracteres também são valores da string. A string completa literal é o valor do objeto String.
Quando a declaração do objeto String não é precedida por const (para constante), o valor de qualquer elemento na string pode ser alterado. Ilustração:
string str = "vwxyz";
string :: iterator q = str.fim();
Q--; Q--; Q--;
*q = 'a';
string :: iterator b = str.fim();
para (b = - -b; b> = str.começar(); B--)
cout << *B << ";
cout << endl;
A saída é:
z y a w v
““Q-; Q-; Q-;”Decremeu o iterador final 3 vezes para apontar para 'C'.
Quando a declaração do objeto de string é precedida por const, os caracteres são somente leitura. Para esse código, o iterador retornou deve ser const_iterator. Nesse caso, o código não compila. O código a seguir emitirá uma mensagem de erro:
const string str = "vwxyz";
String :: const_iterator q = str.fim();
Q--; Q--; Q--;
*q = 'a';
Iteração reversa
O iterador usado com iteração reversa é reverse_iterator. Outra função de membro da classe String é, rend (), que retorna um iterador que aponta logo na frente do primeiro elemento do objeto String. Ainda assim, outra função de membro da classe String é RBegin (), que retorna um iterador que aponta para o último elemento do objeto String. O código a seguir ilustra o uso do reverse_iterator retornado, lendo na direção direta, do primeiro elemento ao último elemento:
string str = "vwxyz";
String :: reverse_iterator p = str.rend ();
para (p = - -p; p> = str.rBegin (); P--)
cout << *p << ";
cout << endl;
A saída é:
V W x y Z
Observe que com o reverse_iterator, ++ é - e =, na condição do tempo.
O código seguinte itera para trás, usando o iterador de rbegin ():
string str = "vwxyz";
para (string :: reverse_iterator q = str.rBegin (); q <= str.rend(); q++)
cout << *q << ";
cout << endl;
A saída é:
z y x w v
Novamente, ++ é usado em vez de - e = = .
Mudança de caráter de um elemento
Quando a declaração do objeto String não é precedida por const (para constante), o valor de qualquer elemento na string pode ser alterado. Ilustração:
string str = "vwxyz";
string :: reverse_iterator q = str.rBegin ();
q ++; q ++;
*q = 'a';
para (string :: reverse_iterator b = str.rBegin (); B <= str.rend(); B++)
cout << *B << ";
cout << endl;
A saída é:
z y a w v
O iterador rBegin (), q, é diminuído duas vezes com “q ++; q ++; ” para apontar para 'C', já que ele inicialmente aponta para o último elemento.
Se um objeto de string for precedido com const, então os personagens podem ser alterados com qualquer tipo de iterador. O compilador emitirá uma mensagem de erro para o código a seguir, porque o código tenta modificar o valor de 'c':
const string str = "vwxyz";
String :: const_reverse_iterator q = str.rBegin ();
q ++; q ++;
*q = 'a';
String constante iteração reversa constante
Um const_reverse_iterator é retornado pela função do membro, CrBegin (). CRBEGIN () é como RBEGIN (), mas o valor apontado pelo seu iterador não pode ser alterado. Um const_reverse_iterator também é devolvido por outra função de membro, Crend (). Crend () é como rend (), mas o valor apontado para, por seu iterador, não pode ser alterado.
O código a seguir exibe todos os valores do objeto String, usando const_reverse_iterator, começando no último elemento:
const string str = "vwxyz";
para (string :: const_reverse_iterator q = str.crBegin (); q <= str.crend(); q++)
cout << *q << ";
cout << endl;
A saída é:
z y x w v
Embora a declaração do objeto String não seja precedida pela const, o código a seguir não compilará. Isto é por causa do uso de const_reverse_iterator. Mesmo que a declaração fosse precedida pela const, ela ainda não compilaria pelo mesmo motivo. O código é:
const string str = "vwxyz";
String :: const_reverse_iterator q = str.crBegin ();
q ++; q ++;
*q = 'a';
Conclusão
A classe String não tem uma função de membro para reverter uma string. No entanto, uma string pode ser revertida indiretamente, iterando de volta para a frente. As funções de membro envolvidas são, end (), begin (), rend (), rbegin (), crend () e crbegin (). Os iteradores envolvidos são iterador, reverse_iterator e const_reverse_iterator. Esses recursos são combinados para produzir uma reversão indireta, mas ainda eficaz, do literal de um objeto de string.