Aby móc używać dobrodziejstwa jakim są vectory, trzeba dołączyć plik nagłówkowy "vector":
Klasa vector należy do przestrzeni nazw "std"(Standard Template Library), dlatego tak jak w przypadku strumieni I/O, trzeba zadeklarować, że będziemy używać tej przestrzeni:
...
using namespace std;
...
Klasa vector jest specjalną, dynamiczną tablicą. Do tej pory pracując z tablicami z góry musieliśmy określać jej rozmiar, bądź operować dynamicznie na tablicy, vector to taka tablica jednowymiarowa, która dynamicznie się rozszerza. Wyobraź sobie, że masz tablicę 10-elementową typu int i musisz użyć jeszcze jedenastego elementu, w przypadku vectora rozszerzasz go to jedenastu elementów i po sprawie. Nie musimy się już martwić, że wyjdziemy poza zakres tablicy, bo sami możemy ten zakres kontrolować.
Powiedzmy, że potrzebujemy tablicy typu int:
#include <iostream>
#include <vector>
using namespace std;
int main(
int argc,
char* argv[])
{
vector<
int> tablica_intow;
//tablica typu int, narazie pusta, jej wielkość wynosi 0 elementów
vector<
int> Tab_int(
20
);
//tablica typu int, jak konstruktor podajemy jej wilekość, 20-elementowa
vector<
float> tablica_floatow;
//tablica typu float, 0-elementowa
vector<
float> Tab_float(
100
);
//tablica typu float, 100-elementowa
system(
"PAUSE"
);
return 0
;
}
Z vectorem możemy pracować tak jak z tablicami, możemy przypisywać wartości elementom vectora odwołując się poprzez indeks:
#include <iostream>
#include <vector>
using namespace std;
int main(
int argc,
char* argv[])
{
vector<
int> tablica_intow(
3
);
tablica_intow[
0
]=
3451
;
tablica_intow[
1
]=
432
;
tablica_intow[
2
]=
-42
;
cout<<tablica_intow[
0
]<<
" "
<<tablica_intow[
1
]<<
" "
<<tablica_intow[
2
]<<endl;
system(
"PAUSE"
);
return 0
;
}
Metoda size() - wielkość vectora
Pierwszą metodą klasy vector, jaką poznamy, to metoda size(), służy ona do zwracania, aktualnej wielkości vectora, czyli ilości elementów z których się składa. Dzięki niej na bieżąco wiemy jak wielki jest nasz vector.
#include <iostream>
#include <vector>
using namespace std;
int main(
int argc,
char* argv[])
{
vector<
int> tablica_intow(
3
);
cout<<tablica_intow.size()<<endl;
//metodą size zwracamy wielkość vectora tablica_intow, czyli u nas 3
//wielkości tablicy często używamy w pętlach, jako warunku zakończenia pętli
for(
int i=
0
;i<tablica_intow.size();i++) tablica_intow[i]=i+
50
;
for(
int i=
0
;i<tablica_intow.size();i++) cout<<tablica_intow[i]<<
" "
;
cout<<endl;
system(
"PAUSE"
);
return 0
;
}
Metoda resize() - zmiana wielkości vectora
Kolejną metodą jest resize(). Ustawia ona nową wielkość wektora, w ten sposób możemy szybko zwiększać lub zmniejszać nasz vector. W nawiasie podajemy nową ilość elementów vectora. Dla przykładu, jeżeli mamy vector 5 elementowy, i nowa wartość jaką mu nadamy będzie 3, to pierwsze 3 elementy pozostają bez zmian, natomiast 2 ostatnie, które się już nie mieszczą w vectorze zostają po prostu usunięte. W przypadku powiększania vectora, wszystkie elementy, które były w vectorze pozostają bez zmian, a te które zostały dodane, przyjmą wartości, które są aktualnie w pamięci.
#include <iostream>
#include <vector>
using namespace std;
int main(
int argc,
char* argv[])
{
vector<
int> tablica_intow(
60
);
tablica_intow.resize(
40
);
//metodą resize nadajemy nową wielkość vectora tablica_intow
tablica_intow.resize(tablica_intow.size()+
10
);
//metodą resize+size zwięksamy wielkość vectora tablica_intow
tablica_intow.resize(tablica_intow.size()-
20
);
//metodą resize+size zmniejszamy wielkość tablica_intow
system(
"PAUSE"
);
return 0
;
}
Metoda clear() - wyczyszczenie vectora
Metoda clear(), służy do usuwania wszystkich wartości z vectora, czyli ustawienia do do wielkości 0-elementowej. Pamiętajmy, że vector to tablica dynamiczna, dlatego przed wyjściem z programu, trzeba zwolnić wszystkie elementy tablicy.
#include <iostream>
#include <vector>
using namespace std;
int main(
int argc,
char* argv[])
{
vector<
int> tablica_intow;
//vector 0-elementowy
tablica_intow.resize(
40
);
//vector 40-elementowy
cout<<tablica_intow.size()<<endl;
tablica_intow.clear();
//znowu vector 0-elementowy
cout<<tablica_intow.size()<<endl;
system(
"PAUSE"
);
return 0
;
}
Metody push_back()/pop_back() - dodawanie/usuwanie ostatniego elementu vectora
Metoda push_back() służy dodawaniu nowej wartości na koniec vectora, za wszystkie istniejące wartości w vectorze. Należy zwrócić uwagę, także na fakt, że wielkość vectora zwiększy się o 1 element. W nawiasie podajemy wartość nowo dodawanego elementu
Metoda pop_back() usuwa ostatni element w vectorze, zmniejszając jego rozmiar o 1 element.
#include <iostream>
#include <vector>
using namespace std;
int main(
int argc,
char* argv[])
{
vector<
int> tablica_intow;
tablica_intow.push_back(
10
);
tablica_intow.push_back(
20
);
tablica_intow.push_back(
-30
);
tablica_intow.push_back(
100
);
cout<<tablica_intow.size()<<endl;
//po dodaniu 4 elementów, vector będzie 4-elementowy
tablica_intow.pop_back();
//usuwamy ostatnią wartość, vector będzie 3-elementowy
cout<<tablica_intow.size()<<endl;
tablica_intow.clear();
system(
"PAUSE"
);
return 0
;
}
Iterator w vector
Iterator to wskaźnik na jakiś element w vectorze. Metodą begin() uzyskujemy adres na pierwszy element, natomiast end() na ostatni. Do operacji w środku vectora wymagane jest odwoływanie się właśnie poprzez iteratory.
#include <iostream>
#include <vector>
using namespace std;
int main(
int argc,
char* argv[])
{
vector<
int> tab(
20
);
vector<
int>::iterator pierwszy_element=tab.begin();
//iterator czyli wskaźnik na pierwszy element
vector<
int>::iterator ostatni_element=tab.end();
//iterator na ostatni element
vector<
int>::iterator dziesiaty_element=tab.begin()+=
9
;
//10 element, pierwszy element zwiększamy o 9
*dziesiaty_element=
10
;
//odwołanie się do wartości poprzez iterator(wskaźnik)
for(vector<
int>::iterator i=tab.begin();i!=tab.end();i++) cout<<*i<<endl;
//wyświetlenie elementów poprzez iteratory(wskaźniki)
tab.clear();
system(
"PAUSE"
);
return 0
;
}
Metoda insert() - wstawianie elementu do vectora
Gdy wstawiamy element na koniec vectora sprawa jest prosta, bo nie robimy nic poza tym. Inaczej jest w przypadku wstawiania elementu w inne miejsce, bo aby wstawić element nie na koniec to trzeba przesunąć wszystkie elementy, przed tym nowym elementem. Dla przykładu mamy tablicę 4-elementową, chcemy na miejsce drugie o indeksie 1, wstawić nową wartość. W tym celu, musimy przesunąć wartości o indeksach 1,2 i 3 o jedno miejsce do przodu, więc takie przesuwanie jest mało wydajne. Najmniejsza wydajność jest gdy chcemy wstawić element na pierwsze miejsce, wtedy musimy przesunąć wszystkie elementy w tablicy.
Metoda insert przyjmuje 2 argumenty, pierwszy to indeks w vectorze, na który ma być wstawiony element, właśnie tutaj podajemy iterator(wskaźnik) na element, w który chcemy wstawić nową wartość. Załóżmy, że stworzymy tablicę 4-elementową i w sam środek(trzeci element, indeks 2) chcemy wstawić nową wartość.
#include <iostream>
#include <vector>
using namespace std;
int main(
int argc,
char* argv[])
{
vector<
int> tab;
tab.push_back(
10
);
tab.push_back(
20
);
tab.push_back(
-30
);
tab.push_back(
100
);
for(
int i=
0
;i<tab.size();i++) cout<<tab[i]<<
" "
;
//wyświetlamy zawartość vectora
cout<<endl;
vector<
int>::iterator it=tab.begin()+=
2
;
//iterator na trzeci element
tab.insert(it,
3000
);
//wstawiamy wartość 3000 jako trzeci element
for(
int i=
0
;i<tab.size();i++) cout<<tab[i]<<
" "
;
//wyświetlamy zawartość vectora
cout<<endl;
tab.clear();
system(
"PAUSE"
);
return 0
;
}
Metoda erase() - usuwanie elementu z vectora
Metodą erase() możemy usunąć element z dowolnego miejsca w vectorze. Przy czym należy pamiętać, że gdy usuwamy element to elementy za usuwanym punktem będą przesunięte o 1 do tyłu. Oczywiście tutaj także będziemy potrzebowali iteratora do usuwanego elementu, który podajemy w nawiasie:
#include <iostream>
#include <vector>
using namespace std;
int main(
int argc,
char* argv[])
{
vector<
int> tab;
tab.push_back(
10
);
tab.push_back(
20
);
tab.push_back(
-30
);
tab.push_back(
100
);
for(
int i=
0
;i<tab.size();i++) cout<<tab[i]<<
" "
;
//wyświetlamy zawartość vectora
cout<<endl;
vector<
int>::iterator it=tab.begin()+=
2
;
//iterator na trzeci element
tab.erase(it);
//usuwamy trzeci element
for(
int i=
0
;i<tab.size();i++) cout<<tab[i]<<
" "
;
//wyświetlamy zawartość vectora
cout<<endl;
tab.clear();
system(
"PAUSE"
);
return 0
;
}