Vector
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.
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;
}
