Jak odwrócić wektor w C ++

Jak odwrócić wektor w C ++
Jeśli wektor ma elementy w sekwencji, „a”, „b”, „c”, „d”, „e” i jest ponownie skonfigurowany tak, że jego sekwencja staje się, „e”, „d”, ',', C ', „b”, „a” wówczas wektor został odwrócony. Niestety taka bezpośrednia odwracalność nie jest możliwa w C++. Jednak wektor w C ++ może zostać iterowany z tyłu, a to jest pośrednia odwracalność. Dzięki temu nie ma potrzeby dosłownie odwracania wektora. W tym artykule wyjaśniono, jak iterować wektor w C ++ z tyłu i zmodyfikować jego elementy.

Przed użyciem wektora w C ++ program powinien zacząć od,

#włączać
#włączać
za pomocą przestrzeni nazw Std;

z uwzględnieniem biblioteki wektorowej. Łatwiej jest zrozumieć odwrotną iterację po podsumowaniu iteracji przekazywania. Tak więc iteracja do przodu jest podsumowana najpierw przed wyjaśnieniem odwrotnej iteracji.

Treść artykułu

  • Iteracja do przodu
  • Odwrotna iteracja
  • Stały odwrotny iterator
  • Wniosek

Iteracja do przodu

Iteracja do przodu dotyczy dwóch iteratorów. Iterator jest opracowanym obiektem wskaźnika o specjalnych cechach. Tutaj dwa interesujące iteratory są zwracane przez funkcję członka początkowego () i funkcję członka end (). Funkcja członka stear () zwraca iterator, który wskazuje na pierwszy element wektora. END () funkcja członka zwraca iterator, który wskazuje tuż poza ostatnim elementem wektora.

Załóżmy, że nazwa wektora to VTR, wówczas następujące oświadczenie zwróci iterator początkowy:

wektor:: iterator p = vtr.zaczynać();

gdzie p jest nazwą podaną Iteratorowi początkowemu. Poniższe oświadczenie zwróci końcowe iterator:

wektor:: iterator q = vtr.koniec();

gdzie q jest nazwą podaną końcowej iteratorowi, można ją zobaczyć z dwóch stwierdzeń, że p i q są tego samego typu, a nawet można je zamienić.

Wszystkie segmenty kodu tego artykułu są zapisane w funkcji Main (). Poniższy kod odczytuje wszystkie elementy wektora, od początku do ostatniego elementu:

wektor vtr = „a”, „b”, „c”, „d”, „e”;
dla (wektor:: iterator p = vtr.zaczynać(); P != vtr.koniec(); P ++)
Cout << *p << ";

Cout < vtr = 'A', 'B', 'C', 'D', 'E';
wektor:: iterator q = vtr.koniec();
dla (q = --q; q> = vtr.zaczynać(); Q--)
Cout << *q << ";

Cout << endl;

Wyjście to:

A B C D E

Kod w nawiasach wyjaśnienia na pętla wymaga. P jest iteratorem, który pierwszy wskazuje na pierwszy element wektora. Chociaż nie wskazuje jeszcze poza wektorem, jest zwiększany przez p ++, aby wskazać każdy element w wektorze. Gdy wskazuje na element w wektorze, wartość (znak) elementu jest uzyskiwana z *p ​​w korpusie formy. * jest operatorem pośredniego.

Poniższy kod odczytuje i wyświetla wartości w wektorze od ostatniego elementu do pierwszego elementu, za pomocą końcowego iteratora:

wektorvtr = „a”, „b”, „c”, „d”, „e”;
wektor:: iterator q = vtr.koniec();
dla (q = --q; q> = vtr.zaczynać(); Q--)
Cout << *q << ";

Cout << endl;

Wyjście to:

E d c b a

Końcowy iterator wskazuje tuż za koniec wektora, a to nie jest element. Tak więc należy go najpierw zmniejszyć, zanim będzie mógł wskazać ostatni element. Stamtąd iteracja może cofnąć się.

Warunkiem pobytu dla pętli tutaj jest: „Jeśli Q jest większa lub równa iteratorowi początkowemu”. Nie może być „jeśli Q nie jest równe iteratorowi początkowemu”, ponieważ wykluczałoby to pierwszy element.

To nieformalny sposób na iterację zacofania. To znaczy, jest to nieformalny sposób na pośrednio odwrócenie wektora.

Zmiana wartości elementu

Gdy instancja wektora nie jest poprzedzona stałą (dla stałej), wartość dowolnego elementu w wektorze można zmienić. Poniższy kod to ilustruje:

wektor vtr = „a”, „b”, „c”, „d”, „e”;
wektor:: iterator q = vtr.koniec();
Q--; Q--; Q--;
*q = 'z';
wektor:: iterator r = vtr.koniec();
dla (r = - -r; r> = vtr.zaczynać(); R--)
Cout << *r << ";

Cout << endl;

Wyjście to:

E D Z B A

Iterator końcowy, Q jest trzykrotnie zmniejszany „Q-; Q-; Q-;" wskazać na „c”.

Jeśli instancja wektorowa jest poprzedzona Const, wówczas żadna wartość elementu nie można zmienić. W takim przypadku stały iterator do przodu musi zostać zwrócony na koniec lub iterator początkowy. Poniższy kod nie zostanie skompilowany, ponieważ podjęto próbę zmiany wartości „C”:

const wektor vtr = „a”, „b”, „c”, „d”, „e”;
wektor:: const_iterator q = vtr.koniec();
Q--; Q--; Q--;
*q = 'z';

Odwrotna iteracja

Odwrotna iteracja ma dwa główne iteratorów. Te iteratory są zwracane przez funkcje członka, rbegin () i rend (). Rend () zwraca iterator, który wskazuje tuż przed pierwszym elementem wektora. rbegin () zwraca iterator, który wskazuje ostatni element wektora. Poniższy kod odczytuje i wyświetla elementy wektora, od pierwszego do ostatniego, w kierunku do przodu:

wektor vtr = „a”, „b”, „c”, „d”, „e”;
wektor>: reverse_iterator p = vtr.rozdzierać();
dla (p = -p; p> = vtr.rbegin (); P--)
Cout << *p << ";

Cout << endl;

Wyjście to:

A B C D E

Używany jest odwrotny iterator. Ponieważ Rend () zwraca iterator, który wskazuje tuż przed pierwszym elementem, który nie jest elementem, należy go zwiększyć, aby wskazać pierwszy element. Ponieważ mamy do czynienia z odwrotnym iteratorem, operator przyrostowy tutaj jest - i nie ++. Ponadto, w stanie,> = jest używany zamiast <= .

Poniższy kod odczytuje i wyświetla wartości w wektorze, od ostatniego elementu do pierwszego elementu, za pomocą iteratora rbegin ():

wektor vtr = „a”, „b”, „c”, „d”, „e”;
dla (wektor:: reverse_iterator q = vtr.rbegin (); Q <= vtr.rend(); q++)
Cout << *q << ";

Cout << endl;

Wyjście to:

E d c b a

Funkcja członka rbegin () zwraca iterator, który wskazuje ostatni element wektora. Zwracany iterator jest reverse_iterator. Rend () zwraca iterator, który wskazuje tuż przed pierwszym elementem. Zwróć uwagę, że warunek White for the Loop ma, ale =, ponieważ mamy do czynienia z odwrotnym iteratorem. Zmniejszenie wraz z tym iteratorem to ++ i nie -.

Zmiana wartości elementu

Gdy instancja wektora nie jest poprzedzona przez Const (dla stałej), wartość dowolnego elementu w wektorze można zmienić za pomocą reverse_iterator. Poniższy kod ilustruje to z odwrotną_prawą:

wektor vtr = „a”, „b”, „c”, „d”, „e”;
wektor:: reverse_iterator q = vtr.rbegin ();
Q ++; Q ++;
*q = 'x';
dla (wektor:: reverse_iterator r = vtr.rbegin (); R <= vtr.rend(); r++)
Cout << *r << ";

Cout << endl;

Wyjście to:

E d x b a

Iterator rbegin (), Q jest zmniejszany dwa razy za pomocą „Q ++; Q ++; ” wskazywać na „c”, ponieważ początkowo wskazuje na ostatni element.

Jeśli instancja wektorowa jest poprzedzona Const, wówczas żadna wartość elementu nie może zostać zmieniona, z iteratorem, czy to iterator odwrotnego_iteratora (czy do przodu). W takim przypadku stały iterator odwrotny musi zostać zwrócony dla funkcji rbegin () lub rend (). Poniższy kod nie zostanie skompilowany, ponieważ podjęto próbę zmiany wartości „C”:

Conster wektor vtr = „a”, „b”, „c”, „d”, „e”;
wektor:: const_reverse_iterator q = vtr.rbegin ();
Q ++; Q ++;
*q = 'x';

Stały odwrotny iterator

crbegin () zachowuje się jak rbegin (), ale zwraca const_reverse_iterator, niezależnie od tego, czy instancja wektora została rozpoczęta od const. Oznacza to, że wartości zwróconego iteratora nie można zmienić. Crend () zachowuje się jak rend (), ale zwraca const_reverse_iterator, niezależnie od tego, czy instancja wektora została rozpoczęta od const. Oznacza to, że wartości zwróconego iteratora nie można zmienić.

Poniższy kod wyświetla wszystkie wartości wektora, za pomocą const_reverse_iterator, zaczynając od ostatniego elementu:

wektor vtr = „a”, „b”, „c”, „d”, „e”;
dla (wektor:: const_reverse_iterator q = vtr.crbegin (); Q <= vtr.crend(); q++)
Cout << *q << ";

Cout << endl;

Wyjście to:

E d c b a

Poniższy kod nie zostanie skompilowany, ponieważ mamy tutaj do czynienia ze stałym odwrotnym iteratorem. Instację wektora nie jest poprzedzona stałą.

wektor vtr = „a”, „b”, „c”, „d”, „e”;
dla (wektor:: reverse_iterator q = vtr.rbegin (); Q <= vtr.rend(); q++)
Cout << *q << ";

Cout << endl;

Wniosek

Wektora nie można dosłownie odwrócić. Można jednak iterować od tyłu do przodu, aby uzyskać podobny wynik. Wraz z iteracją do przodu funkcjonuje elementy, początek () i end (). W przypadku odwrotnej iteracji zaangażowane są funkcje członkowskie, rbegin () i rend (). W takim przypadku zaangażowanym iteratorem jest reverse_iterator, a nie iterator. Wciąż w tym przypadku ++ jest - i> = jest <= . There is also const_reverse_iterator, for crbegin() and crend() member functions.