Narzędzia użytkownika

Narzędzia witryny


opis_kontenera:vector

Vector

Autor: Wojciech Grześkowiak
Vector to rodzaj kontenera który trzyma swoje elementy w określonym porządku. Vector zaimplementowano w sposób przypominający dynamicznie zmieniająca się tablice, przez co do jego elementów można odnosić się zarówno poprzez iterator jaki i bezpośrednio podając numer pozycji jaka nas interesuje. Jest on jednak o wiele lepszy od zwykłej tablicy, gdyż może zwiększać swoją pojemność kiedy będzie jej potrzebował.

Kontener vector należny używać kiedy:

  • do poszczególnych elementów chcemy dostawać się poprzez index,
  • chcemy przeglądać elementy w dowolnej kolejności,
  • dodajemy i usuwamy elementy jedynie z końca kolekcji.


Implementacja vectora w bibliotece standardowej C++ to szablon z dwoma parametrami.

template < class T, class Allocator = allocator<T> > class vector;

gdzie T to typ elementu jaki będziemy przechowywać, a Allocator definiuje sposob przydzielania pamięci dla nowych elementów. Domyślnie jest on już przydzielony, więc nie musimy się o niego martwić.

Przykładowy program ilustrujący zastosowania kontenera można zobaczyćtutaj (vector.cpp)

Skłdniki

Vector udostępnia szereg metod którymi możemy manipulować jego zawartością.

KonstruktoryTworzą vector i inicjalizują przekazanymi danymi.
OperatoryOpeatory manipulacji vectorem.
assignDodaje elementy do vectora.
atZwraca element z podanego miejsca.
backZwraca referencje do ostatniego elementu.
beginZwraca iterator wskazujący na pierwszy elementu.
capacityZwraca liczbę elementów jakie może trzymać vector.
clearUsuwa wszystkie elementy z vectora.
emptyZwraca true jeśli vector jest pusty.
endZwraca iterator wskazujący za ostatni element.
eraseUsuwa dane elementy z vectora.
frontZwraca referencje na pierwszy element.
insertDodaje elementy do vectora.
max_sizeZwraca maksymalną liczbę elementów jakie może trzymać vector.
pop_backUsuwa ostatni element z vectora.
push_backDodaje element na koniec vectora.
rbeginZwraca odwrotny iterator wskazujący na koniec vectora.
rendZwraca odwrotny iterator wskazujący na początek vectora.
reserveUstawia minimalny rozmiar vectora.
resizeZmienia rozmiar vectora.
sizeZwraca liczbę elementów jakie trzyma vector.
swapWymienia elementy jednego vectora z drugim.

Konstruktory

Vector posiada następujące konstruktory.

vector();

Domyślny, tworzący nową pustą instancję kontenera.

vector( const vector& c );

Kopiujący, który tworzy nowy wektor ze skopiowanymi elementami od przekazanego.

vector( size_type num, const TYPE& val = TYPE() );

Tworzy vector z podaną ilością elementów (num), o wartości przekazanej w drugim parametrze val, jeśli wartość nie podana, ustalana jest domyślna dla tego typu.

vector( input_iterator start, input_iterator end );

Tworzy vector z elementami z zakresu jaki ustalają przekazane iteratory.

Operatory

Vector posiada następujące operatory.

TYPE& operator[]( size_type index );
const TYPE& operator[]( size_type index ) const;

Operator ten zwraca element znajdujący się pod wskazaną pozycją.

vector operator=(const vector& c2);

Operator przypisania.

bool operator==(const vector& c1, const vector& c2);
bool operator!=(const vector& c1, const vector& c2);
bool operator<(const vector& c1, const vector& c2);
bool operator>(const vector& c1, const vector& c2);
bool operator<=(const vector& c1, const vector& c2);
bool operator>=(const vector& c1, const vector& c2);

Standardowe operatory porównania. Dwa vectory są równe kiedy:

  • mają taki sam rozmiar,
  • każdy element na pozycji i jednego vectora jest równy elementowi na pozycji i drugiego vectora.

assign

void assign( size_type num, const TYPE& val );
void assign( input_iterator start, input_iterator end );

Metoda assign() dodaje do vectora:

  • num elementów o wartości val,
  • elementy z zakresu wskazywanego przez iteratory start oraz end.

at

TYPE& at( size_type loc );
const TYPE& at( size_type loc ) const;

Funkcja at() zwraca referencje do elementu znajdującego się pod indexem loc. Jest ona o wiele bezpieczniejsza od operatora [] ponieważ sprawdza zakres i w razie przekroczenia rzuca wyjątkiem.

back

TYPE& back();
const TYPE& back() const;

Funckja back() zwraca referencje do ostatniego elementu w vektorze.
Podobne: end

begin

iterator begin();
const_iterator begin() const;

Funkcja begin() zwraca iterator do pierwszego elementu vektora. Wykonywana w stałym czasie.
Podobne: end

capacity

size_type capacity() const;

Funkcja capacity() zwraca liczbę elementów jakie może trzymać vector zanim będzie musiał zmienić swój rozmiar.
Podobne: size, max_size

clear

void clear();

Funkcja clear() usuwa wszystkie elementy vectora. Wykonywana w czasie liniowym.

empty

bool empty() const;

Funkcja empty() zwraca true jeśli vector jest pusty, false jeśli nie.

end

iterator end();
const_iterator end() const;

Funkcja end() zwraca iterator wskazujący tuż za ostatni element vectora. Taka realizacja ułatwia iterację po elementach.
Podobne: begin

erase

iterator erase( iterator loc );
iterator erase( iterator start, iterator end );

Funkcja erase() usuwa:

  • element pod indeksem loc
  • elementy w zakresie ustalonym przez iteratory start oraz end

Podobne: clear

front

TYPE& front();
const TYPE& front() const;

Funkcja front() zwraca referencje do pierwszego elementu w vektorze. Uruchamiana w stałym czasie.
Podobne: back

insert

iterator insert( iterator loc, const TYPE& val );
void insert( iterator loc, size_type num, const TYPE& val );
void insert( iterator loc, input_iterator start, input_iterator end );

Funkcja instert() wstawia:

  • element o wartości val przed indeks loc i zwraca iterator na wstawiony element,
  • num elementów o wartości val przed indeks o wartości loc,
  • elementy z zakresu wzyznaczanego przez iteratory start i end przed indeks loc.

Przykład:

vector<int> v1;
v1.push_back( 0 ); v1.push_back( 1 ); v1.push_back( 2 ); v1.push_back( 3 );
 
vector<int> v2;
v2.push_back( 5 ); v2.push_back( 6 ); v2.push_back( 7 ); v2.push_back( 8 );
 
cout << "Przed w v2 są: ";
for( int i = 0; i < v2.size(); i++ )
   cout << v2[i] << " ";
cout << endl;
 
v2.insert( v2.end(), v1.begin(), v1.end() );
 
cout << "Po w v2 są: ";
for( int i = 0; i < v2.size(); i++ )
   cout << v2[i] << " ";
cout << endl;

Wyświetli:

 Przed w v2 są: 5 6 7 8
 Po w v2 są:  5 6 7 8 0 1 2 3

max_size

size_type max_size() const;

Funkcja max_size() zwraca maksymalną liczbę elementów jakie może trzymać vector. Nie mylić z funkcją capacity.
Podobne: capacity, size

pop_back

void pop_back();

Funkcja pop_back() usuwa ostatni element z vectora. Uruchamiana w stałym czasie.
Podobne: push_back

push_back

void push_back( const TYPE& val );

Funkcja push_back() dodaje element o wartości val na koniec vektora.
Podobne: pop_back

rbegin

reverse_iterator rbegin();
const_reverse_iterator rbegin() const;

Funkcja rbegin() zwraca odwrotny iterator wskazujący na koniec vectora. Uruchamiana w stałym czasie.
Podobne: rend

rend

reverse_iterator rend();
const_reverse_iterator rend() const;

Funkcja rend() zwraca odwrotny iterator wskazujący na początek vectora. Uruchamiana w stałym czasie.
Podobne: rbegin

reserve

void reserve( size_type size );

Funkcja reserve() ustala rozmiar (capacity) do co najmniej rozmiaru size. Uruchamiana w stałym czasie.

resize

void resize( size_type num, const TYPE& val = TYPE() );

Funkcja resize() zmienia rozmiar (size) vectora do rozmiaru num. Jeśli wartość val jest podana, nowo utworzone elementy będą miały właśnie taką wartość. Funkcja uruchamiana w czasie liniowym.

size

size_type size() const;

Funkcja size() zwraca liczbę elementów jakie znajdują się w danym vektorze.
Podobne: capacity, max_size

swap

void swap( container& from );

Funkcja swap() służy do wymiany elementów między vectorami.
Przykład:

vector<string> v1;
v1.push_back("Element w v1");
 
vector<string> v2;
v2.push_back("Element w v2");
 
v1.swap(v2);
 
cout << "Pierwszy element w v1: " << v1.front() << endl;
cout << "Pierwszy element w v2: " << v2.front() << endl;

Wyświetli:

Pierwszy element w v1: Element w v2
Pierwszy element w v2: Element w v1
opis_kontenera/vector.txt · ostatnio zmienione: 2008/12/06 16:55 przez w.grzeskowiak