Czym są dynamiczne tablice C ++?

Zacznijmy od tego, czym jest tablica dynamiczna. Od czasu Si są tablice, ale ich cechą był stały rozmiar, który został zauważony przy tworzeniu i już się nie zmienia. Z tego powodu otrzymały nazwy tablic statycznych. Oczywiście, tablica dynamiczna oznacza, że ​​może zmienić swój rozmiar podczas programu. Można go również utworzyć, gdy liczba przewidywanych elementów jest nieznana, jest pusta.

Dynamiczne zarządzanie pamięcią

Istnieje taka koncepcja, jak zarządzanie pamięcią dynamiczną. Takie podejście w programowaniu pozwala w pełni wykorzystać pamięć komputera. W C ++ proces ten jest kontrolowany przez operacje nowe i usuwane. Operacja new rezerwuje pamięć w dziedzinie pamięci dynamicznej lub tzw. Sterty (free store lub heap in English). W związku z tym operacja usuwania zwalnia rezerwację.


Zgodnie ze standardami programowania pamięci dynamicznej konieczne jest monitorowanie i szybkie czyszczenie, dlatego nowe i usuwane operacje są często używane parami. Zasada ta jest od dawna przestarzała. Jego korzenie rosną od czasu, gdy systemy operacyjne były słabo obserwowane dla pamięci lub po prostu nie wiedziały, jak samemu je posprzątać. Teraz system operacyjny zawsze czyści pamięć po uruchomieniu programu. Jednak wyraźne czyszczenie pamięci jest oznaką dobrego tonu w programowaniu. Nowa operacja rezerwuje pamięć dla obiektu określonego typu i zwraca adres do tej pamięci. Jeśli alokacja pamięci z dowolnego powodu nie może być wykonana, operacja zwróci wskaźnik zerowy (wskaźnik, który nie jestnic nie mówi) i rzuca wyjątek. Nowy operator działa z obiektami dowolnego rodzaju danych: podwójnym, char, int, itp. Przydzielanie pamięci i jej usuwanie są następujące.




int * p = nowy int; //* - oznacza, że ​​zmienna jest wskaźnikiem. Wskaźniki przechowują adresy.
* p = 9;
usuń p;

Tablica jednowymiarowa

Tworzenie jednowymiarowej tablicy dynamicznej jest tym samym, co tworzenie zmiennej w stercie.

podwójne * a = nowe podwójne 
; //a - wskaźnik do pamięci przydzielonej do tablicy 10 elementów typu double
a
= 2,5;
usunąć [] a; //przyjrzyj się bliżej temu projektowi! Jest przebiegła!

Po stwierdzeniu usunięcia konieczne jest określenie nawiasów kwadratowych, aby oznaczyć przyszłą operację programu jako uwolnienie nie tylko wskaźnika do tablicy, ale samej tablicy.

Tablica dwuwymiarowa

Tworzenie jednowymiarowej tablicy dynamicznej jest zadaniem trywialnym. A jeśli potrzebujemy tablicy wielowymiarowej

podwójnej ** ma = nowej podwójnej * 
; //krok 1
dla (int I = 0; I ma [i] = new double
;

Zatem, tworzenie dynamicznej tablicy w C ++ rozmiar 5 na 10. Dosłownie oznacza to w pierwszym kroku przydzielanie do pamięci tablicy 5 elementów, a następnie, w drugim etapie, przydzielanie pamięci do tablicy składającej się z 10 elementów i zapisywanie adresu na niej w poprzedniej tablicy, a więc dla każdej kolumny.

Po co używać wskaźnika drugiego rzędu? To jest wskaźnik do wskaźnika. Jest to trochę trudne do zrozumienia. Chociaż kod dosłownie mówi nam, aby dostać się do jakiejś wartości przechowywanej w tablicy, musimy iść na adres, dostaćjest inny adres, a następnie dostajemy się do wartości.


na początku mówiło się, że wielkość dynamicznej tablicy ulega zmianie w trakcie trwania programu, ale w powyższych przykładach Ta zmiana nie została nigdzie wyraźnie wskazana. Wymiary zmiany tablicy są dokonywane przy użyciu następującego algorytmu:

  1. W pamięci tworzony jest nowy zestaw wymaganych rozmiarów.
  2. Dane ze starej tablicy są przepisywane w nowej tablicy.
  3. Stary masyw zostaje zniszczony.

Wektor STL - nowa dynamiczna tablica

Aby użyć wektorów, musisz połączyć się.

jest znana, a średnia biblioteka szablonu (STB) jest wyposażone w zestaw pojemników, które zarządzają zbiory elementów. Kontenery to kolejne pojemniki. Różnią się głównie uporządkowaniem elementów w czasie wstawiania. Innymi słowy, pierwszy element zawsze będzie pierwszy, a drugi zawsze.. Drugi i tak dalej d Istnieją inne rodzaje pojemników - asocjacyjne posortowane według wartości i wybitne elementy w ogóle.

Jednym z takich kolejnych pojemników jest wektor. Zarządza elementami tablicy C ++ w pamięci dynamicznej. Dostęp do tych pozycji odbywa się bezpośrednio przez indeks. Ponieważ wektor - pojemnik sekwencja, dodawanie i usuwanie elementów odbywa się na końcu tablicy, a operacje te wykonywane są bardzo szybko. Jednak wstawienie nowego elementu w środku lub na początku wektora jest znacznie wolniejsze, ponieważ realizacja tej procedury będą musiały przejść wszystkie poprzednie elementy z aktualnym numerem wkładania. Rozważ przykład.

include,
include,
Int główny () {
std :: wektor V ; //tworzy pusty wektor pamięci typu elementu int
//definicji wektor - przestrzeń matrycy STD, gdyż std ::
do (int i = 0; i v.push_back (I),
} (76 ) do (int i = 0; i std :: cout V [i] "",
}
std std :: :: cout Endl,
układ ("pause"),
}
,

, jak pokazano w kodu, we współpracy z wektorów dokonuje się w taki sam sposób jak macierze. Zatem wektory zaopatrzone w dodatkowe właściwości użytkowe, takie jak C ++ funkcji dynamicznych tablic .size (.). .push_back () Ściśle mówiąc, te funkcje składowe są kontenerów


Związek pośredni typu skrypt = "text /JavaScript" i kwasu
zmienna blockSettings3 = {blockID " RA-70350-3 ", wynajem Erto "yandex_rtb_R-A-70350-3" asynchroniczny :! 0}

jeżeli (document.cookie.indexOf ("abmatch =") i GT = 0) {
blockSettings3 = {blockID "RA 70350-3" renderTo "yandex_rtb_R-A-70350-3" statId: 70350async :! 0}
}

! Zastosowanie (a, b, c, d, e) {A [c] = A [c] || [] A [c] .Push (funkcja () {Ya.Context.AdvManager.render (blockSettings3)} ), e = b.getElementsByTagName ("scenariusz")d = b.createElement ("scenariusz") d.type = "text /JavaScript" d.src = „//an.yandex.ru/System /context.js "d.async = 0e.parentNode.insertBefore (d, e)} (to this.document," yandexContextAsyncCallbacks „);

Dostęp do elementów wektorowych

Uzyskanie dostępu do elementów wektorowych jest tematem, który należy omówić osobno. Istnieją następujące sposoby odwoływania się do elementów wektora.

V [indeks]

Standardowe odniesienie według indeksu

V w (wskaźnika)

,

Odwołanie się do elementu wskaźnika, lecz z wyjątkiem zakres jest generowany w

V. front ()

Odwołanie do pierwszego elementu wektora

z powrotem V ()

,

Odwołanie się do ostatniego elementu wektora

Jest oczywiste, że najbardziej pewny sposób, aby odwoływać się do elementów wektora jest .At wywołanie funkcji (), ponieważ generuje out_of_range wyjątków, które mogą być przetwarzane w bloku try-catch. Funkcja operation [] i .front () .back () działają w nieprzewidywalny sposób, gdy znajdują się poza dopuszczalnym zakresem.

Dwuwymiarowy wektor

Rozważmy przykład tworzenia dwuwymiarowej dynamicznej macierzy C ++ - prostej macierzy 5 na 5.



wektor & gt; v (5 wektor 
);
v
= 10;
int a = v
;
v
.push_back
; //utwórz nowy element na końcu wektora
v
.pop_back (); //usuń ostatni element

Powiązane publikacje