Jak odwrócić tablicę C ++

Jak odwrócić tablicę C ++
Rozważ następującą tablicę: char arrf [] = 'm', 'n', 'o', 'p', 'q';

Odwrotność tej tablicy to:

charrrr [] = 'q', 'p', 'o', 'n', 'm';

Postacie stają się w odwrotnej kolejności, w liście inicitizer_. Zauważ, że w odwrotnej kolejności litera „o” pozostaje na swojej pozycji. Wynika to z faktu, że liczba elementów w tablicy jest dziwna.

Rozważ teraz następującą tablicę:

char arrf [] = „l”, „m”, „n”, „o”, „p”, „q”;

Odwrotność tej tablicy to:

char arrr [] = 'q', 'p', 'o', 'n', 'm', 'l';

Postacie stają się w odwrotnej kolejności, w liście inicitizer_. Tym razem środkowe dwa elementy są zamieniane, ponieważ liczba elementów w tablicy jest równa.

Istnieją różne sposoby odwrócenia tablicy, a ten artykuł bada te sposoby.

Treść artykułu

- Wprowadzenie - patrz wyżej

- Korzystanie z dodatkowej tablicy do odwracania

- Odwrotna tablica, zamieniając elementy

- Odwracanie tablicy za pomocą funkcji rekurencyjnej

- Użycie STD :: reverse ()

- Wniosek

Korzystanie z dodatkowej tablicy do odwracania

Za pomocą tej metody utwórz kolejną tablicę tego samego typu i rozmiaru, co oryginalna tablica, ale pusta. Następnie przeczytaj pierwszą tablicę z tyłu i zamontuj elementy w drugiej tablicy z przodu za pomocą pętli. Poniższy program ilustruje to:

#włączać
za pomocą przestrzeni nazw Std;
int main ()

char arrf [] = 'm', 'n', 'o', 'p', 'q';
int size = sizeof (arrf)/sizeof (arrf [0]); // Uzyskanie wielkości tablicy
charrrr [rozmiar];
for (int i = 0, j = size-1; j> = 0; i ++, j--)
arrr [i] = arrf [j];

dla (int i = 0; iCout<
Cout<powrót 0;

Wyjście to:

Q p o n m

Pierwsza instrukcja w głównej funkcji C ++ tworzy pierwszą tablicę bez wskazania rozmiaru. Drugie stwierdzenie uzyskuje rozmiar, dzieląc całkowity rozmiar tablicy w bajtach przez rozmiar pierwszego elementu tablicy (w końcu wszystkie elementy tablicy C ++, są tego samego typu). Następna instrukcja tworzy drugą tablicę tego samego typu i rozmiaru, ale pusta.

Segment kodu po pętli jest. For pętka kopiuje ostatni element pierwszej tablicy i umieszcza go w pierwszej pozycji drugiej tablicy. Kopiuje element ostatniego drugiego pierwszej tablicy i umieszcza w drugiej pozycji drugiej tablicy. Kopiuje element trzeciego dolnego pierwszej tablicy i umieszcza w trzecie Rozmiar 1. Indeks, J „przesuwa się w dół” pierwszą tablicę z rozmiaru 1 do 0. Poruszam się po drugiej tablicy, a J przesuwa się po pierwszej tablicy.

W nawiasach za pętla, ja i J są zadeklarowane w pierwszym stwierdzeniu. Tak długo, jak J jest większe lub równe zero, kopiowanie będzie kontynuowane - to jest krajna kondycja. Przyrost I i zmniejszenie J, tworzą ostatnie stwierdzenie w nawiasach.

Ostatni na pętla wydrukuje elementy drugiej tablicy.

Odwrotna tablica, zamieniając elementy

Ostatnie i pierwsze elementy można zamienić na jedyną tablicę. Ostatnie i drugie elementy można zamienić na tę samą tablicę. Elementy trzeciej i trzecie. Jeśli liczba elementów jest dziwna, element środkowy nie zmienia swojej pozycji. Jeśli liczba elementów jest wyrównana, istnieją dwa środkowe elementy, które są zamienione.

Znowu istnieją dwie zmienne indeksu: i i j, ale tylko dla jednej tablicy. I jest zwiększany, a J jest zmniejszany dla każdej iteracji, dopóki prawie nie spełniają. Krajobraz tego jest (ja < j). The following program, illustrates this method:

#włączać
za pomocą przestrzeni nazw Std;
int main ()

char arr [] = 'm', 'n', 'o', 'p', 'q';
int size = sizeof (arr)/sizeof (arr [0]);
dla (int i = 0, j = rozmiar-1; i< j; i++,j--)
char temp = arr [i];
arr [i] = arr [j];
arr [j] = temp;

dla (int i = 0; iCout<
Cout<powrót 0;

Wyjście to:

Q p o n m

Odwracanie tablicy za pomocą funkcji rekurencyjnej

Funkcja rekurencyjna jest funkcją, która wciąż się wywołuje, aż do spełnienia stanu. Lepiej to wyjaśniono przykładem. Rozważ następującą najwyższą część programu:

#włączać
za pomocą przestrzeni nazw Std;
char arr [] = 'm', 'n', 'o', 'p', 'q';
int siz = sizeof (arr)/sizeof (arr [0]);
void reversearray (char arr [], int i)
// Warunek podstawowy
if (i == siz)
powrót;
Char Element = arr [i]; // Element wyodrębniania
Reversearray (ARR, i+1); // Wezwanie rekurencyjne
arr [siz-i-1] = element; // Traceback

Tablica jest zadeklarowana, a rozmiar tablicy jest określany jako siz (bez e). Następnie w kodzie jest definicja funkcji rekurencyjnej. Pierwszy segment kodu w funkcji (konstrukt if) jest warunkiem, który należy spełnić. I jest zmienną indeksową dostępu do elementów tablicy od indeksu 0 do indeksu SIZ-1. Kiedy jestem równy SIZ, funkcja powraca i przestaje się nazywać.

Główna funkcja C ++ ma wywołanie,

Reversearray (ARR, 0);

To nazywa funkcją rekurencyjną z dwoma argumentami: pierwsza to nazwa tablicy; Drugi to początkowy indeks i, zero.

Gdy funkcja jest wywoływana po raz pierwszy, „M” jest przypisywany do lokalizacji w pamięci zidentyfikowanej przez element. Po tym stwierdzeniu funkcja jest ponownie wywoływana w funkcji z „Odwracanie (ARR, i+1);”. Ostatnie stwierdzenie w funkcji nie zostało uwzględnione. Tym razem funkcja jest wywoływana z i = 1; i „n” jest przypisywany do innej lokalizacji pamięci, wciąż identyfikowanej przez element.

Po raz trzeci funkcja jest wywoływana, i = 2; a „O” jest przypisywany do trzecie. Czwarty raz funkcja jest wywoływana, i = 3; a „P” jest przypisywany do czwartej lokalizacji pamięci zidentyfikowanej przez element. Po raz piąty funkcja jest wywoływana, i = 4; i „Q” jest przypisywane do piątej lokalizacji pamięci wciąż identyfikowanej przez element.

Szósty raz funkcja jest wywoływana, i = 5, która jest rozmiarem tablicy, a funkcja powraca z powodu konstruktu IF. Wszystko to, ostatnie stwierdzenie w funkcji nie zostało uwzględnione. To ostatnie stwierdzenie to:

arr [siz-i-1] = element;

Z tym stwierdzeniem, cokolwiek jest posiadane przez element, jest przypisywane do pozycji tablicy. Pamiętaj, że istnieje pięć lokalizacji w pamięci z elementem identyfikatora zawierającego postacie: „M”, „N”, „O”, „P”, „Q”, w tej kolejności.

Prawdą jest, że funkcja zwróciła pustkę, ale ostatnia instrukcja musi zostać wykonana pięć razy. Dla każdego wywołania funkcji ostatnia instrukcja została zapisana raz, w pamięci. Po raz pierwszy wykonuje SIZ -I -1 = 5 - 0 - 1 = 4; na wezwanie, dla którego funkcja zwraca się, ale przy użyciu pierwszego indeksu. A więc,

ARR [4] = „Q”
cofając się. Po raz drugi ostatni instrukcja wykonuje, SIZ -I -1 = 5 - 1 - 1 = 3. A więc,
ARR [3] = „P”
Po raz trzeci ostatnie instrukcja wykonuje się, SIZ -I -1 = 5 - 2 - 1 = 2. A więc,
ARR [2] = 'o'
Czwarty raz ostatni instrukcja wykonuje, SIZ -I -1 = 5 - 3 - 1 = 1. A więc,
ARR [1] = 'n'
Piąty i ostatni raz ostatni instrukcja wykonuje SIZ -I -1 = 5 - 4 - 1 = 0. A więc,
ARR [0] = 'M'

I tak tablica została odwrócona za pomocą funkcji rekurencyjnej.

Użycie STD :: reverse ()

STD :: reverse () biblioteki algorytmu można również użyć do odwrócenia tablicy, chociaż nie jest to oczywiste. Aby użyć tej funkcji, biblioteka algorytmu musi zostać włączona do programu. Prototypem funkcji jest:

szablon
constexpr void reverse (bidirectionAliterator pierwszy, biurykcjaliterator ostatni);

Pierwszym argumentem jest iterator wskazujący na pierwszy element pojemnika. Drugim argumentem jest kolejny iterator wskazujący tuż po ostatnim elemencie kontenera. Wskaźnik do pierwszego elementu tablicy można użyć jako pierwszy argument. Wskaźnik wskazujący tuż po ostatnim elemencie tablicy można użyć jako drugi argument.

Jeśli nazwa tablicy to ARR, to wskaźnikiem do pierwszego elementu jest ARR. Wskaźnik wskazujący tuż po ostatnim elemencie tablicy to „ARR + rozmiar”, w którym rozmiar jest rozmiar tablicy. Poniższy program pokazuje, w jaki sposób STD :: reverse () można użyć do odwrócenia tablicy:

#włączać
#włączać
za pomocą przestrzeni nazw Std;
char arr [] = 'm', 'n', 'o', 'p', 'q';
int siz = sizeof (arr)/sizeof (arr [0]); // Rozmiar tablicy
int main ()

rewers (arr, arr+siz);
dla (int i = 0; iCout<
Cout<powrót 0;

Wyjście to:

Q p o n m

Wniosek

Odwracanie tablicy można wykonać za pomocą dodatkowej tablicy, zamieniając elementy tablicy, używając funkcji rekurencyjnej lub za pomocą std :: reverse ().