En streng kan opprettes på to hovedmåter i C++. En streng kan opprettes som en konstant peker til en sekvens av tegn. En streng kan også opprettes ved å gi et strengobjekt fra strengklassen. Denne artikkelen omhandler strengobjekter instantiert fra strengklassen. Dette betyr at strengbiblioteket må inkluderes for å utføre kodeprøvene i denne artikkelen.
Et strengobjekt er en datastruktur der strengen bokstavelig er en liste. Hvert tegn er av ett element på listen. Og så kan en bokstavelig streng håndteres som en rekke elementer.
Denne artikkelen forklarer den klassiske løsning for å reversere en streng i C++. Dette itererer i hovedsak strengen bokstavelig, bakover. Å ha en sammendrag av kunnskap om fremover iterasjon gjør at leseren kan forstå omvendt iterasjon bedre. Denne artikkelen omhandler strengobjekter instantiert fra strengklassen.
All strengkode for denne opplæringen er skrevet i C ++ Main () -funksjonen med mindre annet er angitt.
Artikkelinnhold
Frem iterasjon
En iterator er en pekerklasse som iteratorobjekter kan bli instantiert. Et iteratorobjekt kan brukes til å skanne strengelementer fra begynnelsen av strenglisten til slutten av strenglisten. Strengmedlemsfunksjonen, begynn (), returnerer en iterator som peker på det første elementet i strengen bokstavelig. Det kan økes til den når, like etter det siste elementet i strengen. Strengmedlemsfunksjonen, end (), returnerer en iterator som peker rett etter det siste elementet i strengen bokstavelig. Den kan dekrementeres til den vil nå, det siste elementet i strengen. Disse to iteratorene regnes som fremover iteratorer, selv om den andre itererer bakover.
For et strengobjekt med variabelnavnet, STR, vil følgende uttalelse returnere en Begin Iterator:
streng :: iterator p = str.begynne();
Her er P en begynnende iterator. En slutt iterator kan returneres ved følgende uttalelse:
String :: iterator q = str.slutt();
Her er Q en slutt iterator. P og Q ovenfor er av samme type og kan til og med byttes ut.
Følgende kode skriver ut alle tegnene på strengen, fra start til slutt:
String str = 'v', 'w', 'x', 'y', 'z', '\ 0';
for (streng :: iterator p = str.begynne(); p != str.slutt(); P ++)
cout << *p << ";
cout << endl;
Utgangen er:
v w x y z
'\ 0' skal ikke skrives ut. Det er ment å være der for å markere enden av strengen bokstavelig. Legg merke til hvordan begynnende iterator ble oppnådd. Iterasjonen skanner stikkelisten fra begynnelse til slutt, og sammenligner iteratoren til hvert element med det som er returnert av STR.begynne(); Etter trinn. Når den returnerte iteratoren er den like etter det siste elementet, stopper iterasjonen. En iterator økes eller dekrementeres på samme måte som en indeks er. Uttrykket, *p returnerer verdien som er pekt på, av iteratoren, P.
Følgende kode skriver ut verdiene i strengen, fra det siste tegnet til det første tegnet, ved å bruke End Iterator:
String str = "vwxyz";
String :: iterator q = str.slutt();
for (q = q; q> = str.begynne(); Q--)
cout << *q << ";
cout << endl;
Utgangen er:
z y x w v
Dette er en indirekte reversering av en streng. End Iterator peker rett etter enden av strengen bokstavelig, og et slikt punkt er ikke et element. For at det skal peke på det siste elementet, må det reduseres. Derfra kan iterasjonen gå bakover.
På grunn av det ble slutt iteratoren erklært utenfor for-loopen. Den første verdien av iteratoren i for-loop er en enkelt reduksjon. Iteratoren er dekrementert i trinn til den når det første elementet som indikert med “Str.begynne()". Dette er en uformell måte å iterere bakover. Det vil si at dette er en uformell måte å snu en vektor (indirekte).
Endrer karakter av et element
Strengobjektet er en datastruktur, der strengen bokstavelig er på en liste. Listen består av elementer. Hvert element har en karakter, og den karakteren er verdien av elementet. Karakterene er også verdier av strengen. Den komplette strengen bokstavelig er verdien av strengobjektet.
Når erklæringen om strengobjektet ikke blir gitt av Const (for konstant), kan verdien av ethvert element i strengen endres. Illustrasjon:
String str = "vwxyz";
String :: iterator q = str.slutt();
Q--; Q--; Q--;
*q = 'a';
streng :: iterator b = str.slutt();
for (b = -b; b> = str.begynne(); B--)
cout << *B << ";
cout << endl;
Utgangen er:
z y a w v
“q-; q-; q-;”Decrented the End Iterator 3 ganger for å peke på 'C'.
Når strengobjektserklæringen er gitt av Const, er tegnene skrivebeskyttet. For en slik kode må iteratoren returnert være const_iterator. I dette tilfellet sammenstiller ikke koden. Følgende kode vil utstede en feilmelding:
const string str = "vwxyz";
streng :: const_iterator q = str.slutt();
Q--; Q--; Q--;
*q = 'a';
Omvendt iterasjon
Iteratoren som brukes med omvendt iterasjon er reverse_iterator. En annen medlemsfunksjon av strengklassen er, Rend (), som returnerer en iterator som peker rett foran det første elementet i strengobjektet. Fortsatt er en annen medlemsfunksjon i strengklassen RBegin (), som returnerer en iterator som peker på det siste elementet i strengobjektet. Følgende kode illustrerer bruken av den returnerte reverse_iterator, og leser i retning fremover, fra det første elementet til det siste elementet:
String str = "vwxyz";
streng :: reverse_iterator p = str.Rend ();
for (p = --p; p> = str.rbegin (); p--)
cout << *p << ";
cout << endl;
Utgangen er:
v w x y z
Legg merke til at med reverse_iteratoren er ++ - og =, i stasjonen.
Følgende kode itererer bakover, ved hjelp av iteratoren av RBEGIN ():
String str = "vwxyz";
for (streng :: reverse_iterator q = str.rbegin (); q <= str.rend(); q++)
cout << *q << ";
cout << endl;
Utgangen er:
z y x w v
Igjen brukes ++ i stedet for -, og = .
Endrer karakter av et element
Når erklæringen om strengobjektet ikke blir gitt av Const (for konstant), kan verdien av ethvert element i strengen endres. Illustrasjon:
String str = "vwxyz";
streng :: reverse_iterator q = str.rbegin ();
Q ++; Q ++;
*q = 'a';
for (streng :: reverse_iterator b = str.rbegin (); B <= str.rend(); B++)
cout << *B << ";
cout << endl;
Utgangen er:
z y a w v
Rbegin () iteratoren, Q, er dekrementert to ganger med “Q ++; Q ++; ” å peke på 'C', siden det opprinnelig peker på det siste elementet.
Hvis et strengobjekt er foran med Const, kan ikke -av tegnene endres med noen form for iterator. Kompilatoren vil utstede en feilmelding for følgende kode fordi koden prøver å endre verdien av 'C':
const string str = "vwxyz";
String :: const_reverse_iterator q = str.rbegin ();
Q ++; Q ++;
*q = 'a';
Streng konstant omvendt iterasjon
En const_reverse_iterator returneres av medlemsfunksjonen, crbegin (). crbegin () er som rbegin (), men verdien som er peker på av dens iterator kan ikke endres. En const_reverse_iterator blir også returnert av en annen medlemsfunksjon, crend (). Crend () er som Rend (), men verdien peker på, av dens iterator, kan ikke endres.
Følgende kode viser alle verdiene til strengobjektet, ved hjelp av const_reverse_iterator, fra det siste elementet:
const string str = "vwxyz";
for (String :: const_reverse_iterator q = str.crbegin (); q <= str.crend(); q++)
cout << *q << ";
cout << endl;
Utgangen er:
z y x w v
Selv om erklæringen om strengobjektet ikke er gitt av Const, vil ikke følgende kode utarbeide. Dette er på grunn av bruken av const_reverse_iterator. Selv om erklæringen ble gitt av Const, ville den fortsatt ikke sammenstille av samme grunn. Koden er:
const string str = "vwxyz";
String :: const_reverse_iterator q = str.crbegin ();
Q ++; Q ++;
*q = 'a';
Konklusjon
Strengklassen har ikke en medlemsfunksjon for å snu en streng. Imidlertid kan en streng reverseres indirekte ved å iterere fra bak til front. Medlemsfunksjonene som er involvert er, slutt (), Begin (), Rend (), Rbegin (), Crend () og Crbegin (). Iteratorer involvert er iterator, reverse_iterator og const_reverse_iterator. Disse funksjonene er kombinert for å produsere en indirekte, men fortsatt effektiv reversering av det bokstavelige av et strengobjekt.