Vector

Z RNO-Wiki

vector to super fajny typ w C++. Należy rozumieć go jako tablicę danych. Na przykład jeśli chcemy mieć tablicę char'ów, to piszemy

 vector< char > tablica;

Teraz zmienna tablica jest tablicą char'ów.

Spis treści

resize

Możemy nadać jej rozmiar pisząc

 tablica.resize(50);

Ogólnie funkcja resize(int n) służy do zmiany rozmiaru tablicy (wektora). Czasem rozmiar ten się zmniejsza, a czasem zwiększa.

Jeśli przy zwiększaniu rozmiaru tablicy chcemy nadać wartość nowym komórkom, to możemy to zrobić następująco:

 tablica.resize(50, 'x');

Teraz nowe komórki będą miały wartość 'x'.

clear()

Chcąc wykasować z pamięci całą zawartość wektora, wystarczy zrobić

 tablica.clear();

size()

Aby dowiedzieć się ile jest aktualnie elementów w tablicy, należy użyć funkcji size()

 int rozmiar;
 rozmiar = tablica.size();

push_back(x), pop_back()

Wektory można wyygodnie wydłużać o nowy element używając funkcji push_back(x). Funkcja ta dołączy na końcu tablicy nowy element, przez co rozmiar tablicy zwiększy się o jeden.

 tablica.push_back( 'A' ); // dołącz na koniec tablicy jednego char'a - literę 'A'

Chcąc usunąć ostatni element, można użyć funkcji pop_back():

 tablica.pop_back();

Oczywiście można też zrobić to tak:

 tablica.resize( tablica.size()-1 ); // uwaga na pustą tablicę

Ale po co? Zwłaszcza, że jest to niebezpieczne jeśli wcześniej było

 tablica.size()==0

Konstruktory wektorów

Wektory mają kilka konstruktorów.

Domyślnie

  vector<int> tab;

wektor tab jest pustym wektorem, tzn.

  tab.size()==0

Można przy konstrukcji podać rozmiar

  vector<int> tab(1000); // assert( tab.size()==1000 );

Można zainicjować każdą wartość w tablicy następująco

  vector<int> tab(1000, 0); // wektor samych zer

Można też poprostu skopiować inny wektor

  vector<int> tablica2(tab); // kopia wektora tab

Rozmiar pamięciowy miliona pustych wektorów

Uwaga : STL-owe struktury mogą zajmować niepotrzebnie dużo pamięci. Chociaż ostatnio na wielu zawodach dopuszczalne jest stosowanie STL'a, a czasem nawet programy wzorcowe napisane przy użyciu tej biblioteki, to i tak nalezy rozważnie używać STL'a.

Na przykład jeden vector

 vector<int> Jeden(1000);

Zajmuje kilkanaście bajtów więcej niż

 int jeden[1000];

Nie dziwne. W końcu vector to coś znacznie więcej niż tablica.

Kilkanaście bajtów to nie jest wiele; ale robi się wiele, gdy chcemy tych wektorów więcej niż jeden, np. milion

Kompilując poniższy program

#include<vector>  // daje wektor
using namespace std;

vector<int> graph[1000000];

int main(void)
{
        return 0;
}

otrzymamy informację, że po uruchomieniu, nasz program zajmuje ok 24 MB pamięci.

Za wygodę trzeba płacić

Gdyby użyć listy, mianowicie poniższy program

#include<list>  // daje wektor
using namespace std;

list<int> graph[1000000]; // milion pustych list int'ów

int main(void)
{
        return 0;
}

to zużylibyśmy już tylko 16 MB.


Chcąc naprawdę zaoszczędzić i móc jednak uzywać miliona list int, aby np. pamiętać listy sąsiedztwa w grafie, najlepiej uzyć stl'owej struktury slist, która jest listą jednokierunkową. Teraz milion slist zajmie ok. 8 MB. Oto program

#include<slist.h>  // daje wektor
using namespace std;

slist<int> graph[1000000]; // milion pustych list int'ów (listy są jednokierunkowe, więc zajmują mniej)

int main(void)
{
        return 0;
}
Osobiste