beesoft.org

Wektory. #include <vector>

0. Wstep.

Jednym z najczesciej uzywanych elemntow biblioteki STL sa wektory (klasa vector).
Wektor to dynamicznie zarzadzana tablica Inaczej niz podczas uzywania zwyklej tablicy (np. char[128]), rozmiar wektora nie jest staly i jest dynamicznie rozszerzany jesli zachodzi taka koniecznosc. Owo dynamiczne rozszerzanie odbywa sie w tle, programista nie musi rozmyslac, czy i jak powiekszyc rozmiar tablicy.

Ciekawa i wazna (ze wzgledu na szybkosc) wlasciwoscia wektorow jest to, ze wszystkie jego elementy zajmuja ciagly obszar pamieci (tzn. wszystkie elementy sa ulokowane w pamieci obok siebie).
Czyli dla kazdego n takiego ze, 0 <= n <= v.size() zachodzi &v[n] = &v[0] + n.
Wlasciwosc ta jest wsrod konterow STL unikalna i na przyklad nie dotyczy ona list.

Waznym jest fakt, ze dostep do dowolnego elementu wektora jest najszybszym z mozliwych, O(1).
Dostep do elementu uzyskujemy przez podanie jego pozycji (indeksu) w kontenerze (tak jak w zwyklych tablicach).

Klasa wektor wspiera iteratory random-access. Oznacza to, ze przy pracy z wektorami moga byc wykorzystywane wszystkie algorytmy zaimplementowane w bibliotece STL.
Wektory spelniaja warunki ogolne dotyczace kontenerow, warunki wymagane dla konterow wstecznych (posiada reverse iterator), oraz warunki kontenerow sekwencyjnych wraz z warunkami opcjonalnymi.


1. Najczesciej wykonywane operacje.

Pokazane na rysunku operacje nie sa wszystkimi operacjami jakie mozna wykonywac na wektorze. Sa to operacje najczesciej uzywane.

Wiecej na temat tych i innych operacji, ktore mozna wykonywac na wektorze znajdziesz w dalszej czesci opisu.

2. Konstrukcja obiektu.

Poniewaz wektor jest kontenerem, mozemy go deklarowac dla (prawie) dowolnego typu.
...
vector<int>     vector_of_int;
vector<string>  vector_of_strings;
vector<double>  vector_of_dbl;
vector<MyClass> vector_of_myclass;
...
Musimy teraz sobie wyjasnic sobie zwrot "prawie dowolnego typu".
Wektor mozna tworzyc dla kazdego wbudowanego typu prostego (int, char, float, double itd). Mozna go takze tworzyc dla klas. Ale klasy te musza spelniac trzy warunki: Domyslnie warunki drugi i trzeci sa zawsze spelnione i dlatego moga byc potencjalnym zrodlem trudnych do wykrycia bledow. Wynika to z faktu, ze jesli programista nie zadeklaruje obu tych elementow w sposob jawny, zrobi to za niego kompilator. Kompilator stworzy domyslny konstruktor kopiujacy i domyslny operator przypisania.
Jesli nasza klasa zawiera wskazniki, lub dziedziczy po innych klasach, owe domyslnie wygenerowane funkcje beda dzialaly blednie. Tym samym blednie bedzie dzialal wektor.
Wniosek jest prosty, nalezy te elementy zdefiniowac samemu, lub zablokowac mozliwosc ich automatycznego tworzenia przez kompilator.
Contact: piotr@beesoft.org
(C) 2006-2008 beesoft.org
Last modification date: 2008-06-29
Visitis counter:
counter of visits