Wstęp.
Jednym ze składników STL (Standard Template Library – Standardowa Biblioteka Wzorców) są pojemniki – wektory, które oferują przechowywanie obiektów danego typu w liniowym porządku oraz szybki do nich dostęp (random access). W czasie działania programu możemy zwiększać i zmniejszać ilość elementów w nich zawartych, co czyni je bardzo przydatnymi. Wektory mogą być indeksowane jak zwykłe tablice (mojWektor[10] = 2). Posiadają szereg przydatnych funkcji umożliwiających dodawanie nowych obiektów, usuwanie, wstawianie obiektu do środka itp. itd.
Operacje usuwania oraz dodawania na końcu zajmują stały okres czas, podczas gdy wstawianie elementu do środka bądź usuwanie go zajmuje liniowy czas, gdyż pozostałe obiekty muszą być odpowiednio przesunięte. Aby móc korzystać z wektorów, musisz zainclude’ować plik vector:
1 |
#include |
Wadą wektorów jest to, że nie można pracować na nich korzystając ze wskaźników (ale zamiast nich mamy do dyspozycji iteratory, o których niebawem) tak jak to można było robić używając tablic:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#include int tab[] = {10 , 20 , 30} ; int *wsk = tab ; int main() { wsk += 2 ; std::cout << *wsk << std::endl ; // pokaże wartość 3 elementu return 0 ; } |
To by było na tyle słowem wstępu ;]
Definiowanie wektorów.
Wektory definiujemy w następujący sposób:
1 |
vector nazwa ; |
lub
1 |
vector nazwa2(ilosc_elementow) ; |
Wektor nazwa będzie pusty, a wektor nazwa2 będzie zawierał podaną liczbę elementów. Wektory indeksowane są od 0, a wartościowane (w tym przypadku) zerami.
Metody.
Do pracy z wektorami mamy do dyspozycji szereg funkcji, oto one:
assign | Opróżnia wektor oraz kopiuje do niego wskazane elementy. |
at | Zwraca referencję do elementu na wskazanym miejscu w wektorze. |
back | Zwraca referencję do ostatniego elementu w wektorze. |
begin | Zwraca iterator wskazujący na pierwszy element. |
capacity | Zwraca wielkość aktualnie zajmowanej przez wektor pamięci. |
clear | Opróżnia wektor. |
empty | Sprawdza, czy wektor jest pusty. |
end | Zwraca iterator który wskazuje na sam koniec wektora (za ostatnim elementem!). |
erase | Usuwa element bądź elementy od danego miejsca do danego. |
front | Zwraca referencję do pierwszego elementu w wektorze. |
get_allocator | Zwraca alokator klasy używany przez wektor. |
insert | Wstawia element lub kilka elementów do wektora na wskazaną pozycję. |
max_size | Zwraca maksymalną długość wektora. |
pop_back | Usuwa ostatnio element wektora. |
push_back | Dodaje element na końcu wektora. |
rbegin | Zwraca iterator do pierwszego elementu odwróconego wektora. |
rend | Zwraca iterator wskazujący zaraz za ostatnim elementem odwróconego wektora. |
reserve | Rezerwuje podaną wielkość pamięci dla obiektów wektora. |
resize | Ustala nowy rozmiar wektora. W pierwszym parametrze podajemy nową wielkość wektora, a w drugim wartość nowych elementów (jeśli jej nie podamy, użyta zostanie domyślna wartość). Jeżeli nowa wielkość jest większa od poprzedniej, do wektora dodawane są nowe elementy o wartości takiej, jaką przekazaliśmy w drugim parametrze. Jeżeli nowa wielkość jest mniejsza, to usuwane są końcowe elementy aż osiągnięta będzie odpowiednia wielkość. |
size | Zwraca ilość elementów w wektorze. |
swap | Zamienia między sobą elementy dwóch wektorów. |
vector | Konstruuje wektor o określonej wielkości z elementami o określonej wartości ze specyficznym alokatorem bądź kopią alokatora innego wektora. |
Iteratory.
Iteratory służą do pracy na pojemnikach, jak np. na wektorach. Można je przesuwać jak wskaźniki, dzięki czemu stają się bardzo przydatne, gdyż w pracy z pojemnikami nie można używać wskaźników. Do wyboru mamy kilka iteratorów, jak np. iterator oraz reverse_iterator – pierwszy z nich pozwala odczytywać i modyfikować elementy wektora, a drugi pozwala na to samo, tylko, że w odwróconym wektorze. Wartość wskazywanego elementu pozyskujemy za pomocą operatora wyłuskania (*). Występują także wersje iteratorów, które mogą jedynie odczytywać wartości – const_iterator oraz const_reverse_iterator. Iteratory definiujemy w następujący sposób:
1 2 3 |
vector::iterator mojIterator ; vector::const_iterator mojStalyIterator ; |
Użycie:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
mojIterator = Vec2.begin() ; *mojIterator = 789 ; cout << "\n" << *mojIterator ; mojStalyIterator = Vec2.begin() ; // blad! // *mojStalyIterator = 10000 ; cout << "\n" << *mojStalyIterator ; for (mojIterator = Vec2.begin() ; mojIterator != Vec2.end() ; mojIterator++) cout << "\n" << *mojIterator ; |
Przykład zastosowania.
Prosty przykład pokazujący, jak posługiwać się wektorami:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 |
#include #include using namespace std ; vector Vec(4) , Vec2 ; vector::iterator itVec ; int main() { int i ; for (i = 0 ; i < Vec.size() ; i++) Vec = i + 1 ; // assign Vec2.assign(Vec.begin() + 1 , Vec.end() - 1) ; cout << "\nPrzypisalismy drugiemu wektorowi drugi i trzeci element pierwszego wektora:\n" ; for (i = 0 ; i < Vec2.size() ; i++) cout << Vec2 << endl ; // at cout << "\nNa pierwszej pozycji znajduje sie element o wartosci:" ; cout << "\n" << Vec.at(0) << endl ; // back cout << "\nNa ostatniej pozycji znajduje sie element o wartosci:" ; cout << "\n" << Vec2.back() << endl ; // begin cout << "\nIteratorem odczytujemy wartosc pierwszego elementu:" ; itVec = Vec2.begin() ; cout << "\n" << *itVec << endl ; // capacity cout << "\nDlugosc wektora:" ; cout << "\n" << Vec2.capacity() << endl ; // clear Vec2.clear() ; // empty if (Vec2.empty()) cout << "\nWektory Vec2 jest pusty." << endl ; // end cout << "\nUzywajac iteratora wypisujemy wartosci elementow wektora:" ; itVec = Vec.end() ; for (itVec = Vec.begin() ; itVec != Vec.end() ; itVec++) cout << "\n" << *itVec ; cout << endl ; // erase // usuwamy drugi element cout << "\nUsuwamy drugi element:" ; Vec.erase(Vec.begin() + 1) ; for (itVec = Vec.begin() ; itVec != Vec.end() ; itVec++) cout << "\n" << *itVec ; // usuwamy pozostałe trzy elementy Vec.erase(Vec.begin() , Vec.end()) ; cout << endl ; // dodamy z powrotem 4 elementy for (i = 0 ; i < 4 ; i++) Vec.push_back(i + 1) ; // // front cout << "\nWartosc pierwszego elementu to:" ; cout << "\n" << Vec.front() << endl ; // insert cout << "\nWstawiamy na trzecia pozycje element o wartosci 10." ; Vec.insert(Vec.begin() + 2 , 10) ; cout << "\nWstawiamy na poczatku piec elementow o wartosciach 100." ; Vec.insert(Vec.begin() , 5 , 100) ; // wypisujemy for (itVec = Vec.begin() ; itVec != Vec.end() ; itVec++) cout << "\n" << *itVec ; cout << endl ; // pop_back Vec.pop_back() ; cout << "\n" << "Usunalem ostatni element wektora (4).\n" ; // push_back cout << "\n" << "Dodam nowy element na koncu o wartosci 13:" ; Vec.push_back(13) ; cout << "\n" << Vec.back() << endl ; // rbegin cout << "\nPierwszy element odwroconego wektora ma wartosc:" ; vector::reverse_iterator revIt ; revIt = Vec.rbegin() ; cout << "\n" << *revIt << endl ; // rend cout << "\nOdwrocony wektor:" ; for (revIt = Vec.rbegin() ; revIt != Vec.rend() ; revIt++) cout << "\n" << *revIt ; cout << endl ; // resize cout << "\nZmieniam wielkosc wektora, 5 nowych elementow o wartosciach 12345:" ; Vec.resize(15 , 12345) ; for (itVec = Vec.begin() ; itVec != Vec.end() ; itVec++) cout << "\n" << *itVec ; cout << endl ; cout << "\nZmieniam wielkosc wektora, zmnieszy sie on o 10 elementow:" ; Vec.resize(5) ; for (itVec = Vec.begin() ; itVec != Vec.end() ; itVec++) cout << "\n" << *itVec ; cout << endl ; // size cout << "\nWektor ma tyle elementow: " << Vec.size() << endl ; // swap cout << "\nZamieniam miejscami elementu dwóch wektorow." ; cout << "\nElementy Vec:" ; for (itVec = Vec.begin() ; itVec != Vec.end() ; itVec++) cout << "\n" << *itVec ; Vec2.resize(2 , 5) ; cout << "\nElementy Vec2:" ; for (itVec = Vec2.begin() ; itVec != Vec2.end() ; itVec++) cout << "\n" << *itVec ; Vec.swap(Vec2) ; cout << "\nPo zamianie:" ; cout << "\nElementy Vec:" ; for (itVec = Vec.begin() ; itVec != Vec.end() ; itVec++) cout << "\n" << *itVec ; cout << "\nElementy Vec2:" ; for (itVec = Vec2.begin() ; itVec != Vec2.end() ; itVec++) cout << "\n" << *itVec ; cout << endl ; vector::iterator mojIterator ; vector::const_iterator mojStalyIterator ; mojIterator = Vec2.begin() ; *mojIterator = 789 ; cout << "\n" << *mojIterator ; mojStalyIterator = Vec2.begin() ; // blad! // *mojStalyIterator = 10000 ; cout << "\n" << *mojStalyIterator ; for (mojIterator = Vec2.begin() ; mojIterator != Vec2.end() ; mojIterator++) cout << "\n" << *mojIterator ; return 0 ; } |
—
W załączniku znajdziesz gotowy do uruchomienia powyższy przykład w Visual C++ 6, CodeBlocks 1.0rc2 oraz Dev-C++ 4.9.9.2
Więcej informacji znajdziesz na MSDN:
Pozdrawiam