Vector (dinamički niz) u C++
Vector je generički kontejner koji čuva elemente istog tipa i predstavlja fleksibilniju alternativu klasičnim nizovima u C++.
Drugim rečima, vector možemo posmatrati kao dinamički niz — njegova veličina se može menjati tokom izvršavanja programa.
Razlika između niza i vector-a
Deklaracija klasičnog niza:
int niz[3] = {4, 2, 7};
Ovde se mora navesti veličina niza (3), koja se kasnije ne može menjati.
Kod vector-a, za razliku od toga, veličina se može menjati u toku programa — elementi se mogu dodavati i uklanjati po potrebi.
Klasični niz ima fiksnu veličinu, dok je
std::vector dinamički i može da raste ili se smanjuje.
Kako vector radi "ispod haube"
Iako vector deluje kao "magija", on zapravo koristi običan niz u memoriji — ali sa dodatnom logikom.
Vector interno čuva:
- pokazivač na niz u memoriji
- trenutni broj elemenata (size)
- kapacitet (capacity) — koliko elemenata može stati bez proširenja
// primer stanja vector-a
[10][20][30][ ][ ] // size = 3, capacity = 5
Kada se vector popuni i pokušaš da dodaš još elemenata, on:
- alocira veću memoriju (obično duplo veću)
- kopira stare elemente
- oslobađa staru memoriju
Zbog ovog procesa, dodavanje elemenata (
push_back) je
amortizovano O(1), ali ponekad može biti sporije zbog realokacije.
Uključivanje biblioteke
Da bismo koristili vector, potrebno je uključiti odgovarajuću biblioteku:
#include <vector>
Često se koristi i:
using namespace std;
U suprotnom, morali bismo da pišemo:
std::vector umesto samo vector.
U većim projektima se preporučuje korišćenje
std::vector umesto
using namespace std;, kako bi se izbegli konflikti imena.
Deklaracija vector-a
#include <vector>
using namespace std;
vector<int> a(10);
Ovo predstavlja deklaraciju vector-a koji sadrži 10 elemenata tipa int.
Objašnjenje:
vector– tip kontejnera<int>– tip elemenata (generički parametar)a– ime vector-a(10)– početna veličina (vector ima 10 elemenata)
Ovaj vector već sadrži 10 elemenata (inicijalizovanih na 0 za
int),
nije prazan!
Pristup elementima
Elementima vector-a pristupa se slično kao kod nizova:
a[3];
Ovo pristupa četvrtom elementu (indeksi počinju od 0).
Kao i kod nizova, ne postoji automatska provera granica kod operatora
[].
Za sigurniji pristup koristi a.at(3).
Ako pristupiš nepostojećem indeksu pomoću
[], program može imati
nepredvidivo ponašanje (greške koje je teško pronaći).
Osnovne operacije sa vector-om
Osnovna manipulacija vector-om
U ovom primeru ilustrujemo kako koristiti std::vector za dinamičko upravljanje nizom podataka.
Demonstriraćemo:
- dodavanje elemenata pomoću push_back()
- prolazak kroz vector pomoću range-based for petlje
- dobijanje veličine pomoću size()
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> numbers;
// Dodavanje elemenata
numbers.push_back(10);
numbers.push_back(20);
numbers.push_back(30);
// Ispis elemenata
cout << "Elementi vektora: ";
for (int num : numbers) {
cout << num << " ";
}
// Veličina vektora
cout << "\nVeličina vektora: " << numbers.size() << endl;
return 0;
}
Vector
numbers je inicijalno prazan. Elementi se dodaju dinamički pomoću push_back().
Range-based for petlja
Petlja oblika:
for (int num : numbers)
znači: za svaki element iz vector-a, kopiraj vrednost u promenljivu num.
Ako želiš da izbegneš kopiranje (efikasnije), koristi referencu:
for (int& num : numbers)
Dodavanje elementa – push_back()
Metoda push_back() dodaje element na kraj vector-a.
a.push_back(13);
Ako vector nema dovoljno kapaciteta, dolazi do realokacije memorije (kopiranje elemenata u veći blok memorije).
Veličina vector-a – size()
Veličina vector-a (broj elemenata) dobija se pomoću metode size().
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> b = {10, 20, 30, 40, 50};
cout << "Vektor ima " << b.size() << " elemenata" << endl;
return 0;
}
size() vraća broj elemenata, dok capacity() govori koliko elemenata može stati bez proširenja.
Prvi i poslednji element
Prvi element dobijamo pomoću front(), a poslednji pomoću back().
vector<string> grupa = {"Mika", "Pera", "Laza", "Nataša"};
cout << "Prvi u grupi je " << grupa.front() << endl;
cout << "Poslednji u grupi je " << grupa.back() << endl;
Ove metode ne smeju da se koriste nad praznim vector-om — dolazi do greške.
Izmena elementa
Element možemo promeniti direktnim pristupom:
vector<int> brojevi = {0, 4, 11, 6};
brojevi[2] = 5;
Ili sigurnijom metodom:
brojevi.at(2) = 5;
[] ne proverava granice, dok at() baca grešku ako indeks nije validan.
Ubacivanje elementa – insert()
Ako želimo da ubacimo element bez brisanja postojećeg, koristimo insert().
vector<int> brojevi = {0, 4, 5, 6};
int poz = 1;
auto itr = brojevi.begin() + poz;
brojevi.insert(itr, 3);
Nakon ovoga vector postaje:
{0, 3, 4, 5, 6}
Šta je iterator?
Iterator je objekat koji pokazuje na element u container-u (kao pokazivač).
auto itr = brojevi.begin();
begin() vraća iterator na prvi element vector-a.
[0] [3] [4] [5] [6]
^
itr
auto automatski određuje tip promenljive — ovde je to iterator tipa vector-a.
Ubacivanje više elemenata
int poz = 3;
auto itr = brojevi.begin() + poz;
brojevi.insert(itr, {11, 12, 13});
Rezultat:
{0, 3, 4, 5, 11, 12, 13, 6}
Elementi nakon mesta ubacivanja pomeraju se udesno.
Brisanje elemenata iz vector-a
Brisanje poslednjeg elementa – pop_back()
Poslednji element vector-a može se ukloniti pomoću metode pop_back().
#include <vector>
using namespace std;
vector<double> temperature = {23.2, 25.8, 11, 15.3, 17};
temperature.pop_back();
Nakon ove operacije vector sadrži:
23.2, 25.8, 11, 15.3
Metoda
pop_back() ne vraća obrisanu vrednost — samo uklanja poslednji element.
Ako ti treba poslednji element pre brisanja, koristi
back() pa tek onda pop_back().
Brisanje elementa na određenoj poziciji – erase()
Metoda erase() briše element na koji pokazuje iterator.
#include <vector>
using namespace std;
vector<int> c = {2, 3, 4};
c.erase(c.begin() + 1); // briše element na indeksu 1
Nakon brisanja:
2, 4
Svi elementi nakon obrisanog se pomeraju ulevo.
Šta se dešava u memoriji?
Kada obrišemo element pomoću erase(), vector ne briše samo taj element —
već pomera sve naredne elemente za jedno mesto ulevo.
Pre:
[2] [3] [4]
erase na indeksu 1
Posle:
[2] [4] [_]
Veličina (size) se smanjuje, ali kapacitet (capacity) ostaje isti.
Zbog pomeranja elemenata,
erase() ima složenost O(n).
Brisanje svih elemenata – clear()
Ako želimo da obrišemo sve elemente vector-a, koristimo metodu clear().
#include <vector>
using namespace std;
vector<int> c = {2, 3, 4};
c.clear(); // briše sve elemente
Nakon ove operacije, vector je prazan.
clear() postavlja veličinu na 0, ali memorija (capacity) može ostati rezervisana.
Ispisivanje elemenata vector-a
Neka je dat sledeći vector:
#include <vector>
using namespace std;
vector<int> brojevi = {1, 2, 3, 4, 5};
Primer ispisa pomoću klasične for petlje:
#include <iostream>
using namespace std;
for (int i = 0; i < brojevi.size(); i++) {
cout << brojevi[i] << " ";
}
cout << endl;
Izlaz:
1 2 3 4 5
Moderniji način je korišćenje range-based for petlje:
for (int x : brojevi)
Unos podataka u vector sa standardnog ulaza
Čitanje reči i smeštanje u vector
U ovom primeru učitavamo tekstualne podatke sa standardnog ulaza i smeštamo ih u
vector<string>.
Potrebno je uključiti zaglavlje <string>, jer radimo sa tekstualnim podacima.
#include <vector>
#include <iostream>
#include <string>
using namespace std;
int main() {
// Vektor stringova
vector<string> text;
// Promenljiva za unos jedne reči
string rec;
// Učitavanje dok god ima unosa
while (cin >> rec) {
text.push_back(rec);
}
return 0;
}
cin >> rec učitava jednu reč (do razmaka).
Unos se završava kada korisnik pošalje EOF (npr. Ctrl + D na Linux/Mac ili Ctrl + Z na Windows).
Ako želiš da učitavaš ceo red (sa razmacima), koristi
getline(cin, rec).
Ispis elemenata pomoću indeksa ([])
Da bismo ispisali sve unesene reči, možemo koristiti klasičnu for petlju i operator [].
cout << "Reči u tekstu:\n";
for (int i = 0; i < text.size(); i++) {
cout << text[i] << " ";
}
cout << endl;
Operator
[] ne proverava granice — ako indeks nije validan, dolazi do greške.
Kako radi pristup pomoću indeksa?
text[0] → prva reč
text[1] → druga reč
text[2] → treća reč
Interno, vector čuva elemente u kontinualnom bloku memorije, isto kao niz.
["Zdravo"]["svete"]["C++"]
0 1 2
Zbog kontinualne memorije, pristup elementima pomoću indeksa je veoma brz — O(1).
Alternativni (moderniji) način ispisa
Isti rezultat možemo dobiti jednostavnije pomoću range-based for petlje:
for (const string& rec : text) {
cout << rec << " ";
}
const string& rec znači:
- const – ne menjamo vrednost
- & – koristimo referencu (bez kopiranja)
- rec – trenutni element
Testirajte svoj kod ovde!
Prolaženje kroz elemente vektora pomoću iteratora
Sledeći primer pokazuje kako se koristi iterator za prolazak kroz elemente vector-a.
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> poeni = {5, 3, 5, 7, 8, 2, 3, 4};
cout << "Broj poena po zadacima:\n";
for (vector<int>::iterator it = poeni.begin();
it != poeni.end(); ++it)
{
cout << *it << " ";
}
cout << endl;
return 0;
}
Šta je iterator?
Iterator je objekat koji se ponaša slično pokazivaču — pokazuje na element u container-u.
[5] [3] [5] [7] [8]
^
it
Operator *it znači: uzmi vrednost na koju iterator pokazuje.
Iterator ne sadrži vrednost, već adresu elementa (kao pointer).
begin() i end()
begin()– vraća iterator na prvi elementend()– vraća iterator koji pokazuje iza poslednjeg elementa
[5] [3] [5] [7] [8]
^
end()
Petlja ide do
end(), ali ga nikad ne dereferencira (*end() je greška).
Moderniji način (auto)
Umesto dugog zapisa iteratora, može se koristiti auto:
for (auto it = poeni.begin(); it != poeni.end(); ++it) {
cout << *it << " ";
}
auto automatski prepoznaje tip promenljive (ovde: iterator).
Sortiranje vector-a
Za sortiranje se koristi funkcija sort() iz biblioteke <algorithm>.
#include <algorithm>
Primer sortiranja:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<int> a = {4, 2, 7, 5, 9};
sort(a.begin(), a.end());
for (int x : a) {
cout << x << " ";
}
return 0;
}
Rezultat (rastući redosled):
2 4 5 7 9
Sortiranje u opadajućem redosledu
Za opadajuće sortiranje koristi se dodatni parametar (komparator):
#include <functional>
sort(a.begin(), a.end(), greater<int>());
Rezultat:
9 7 5 4 2
Šta je komparator?
Komparator je funkcija koja definiše kako se elementi porede.
bool mojKomparator(int a, int b) {
return a > b; // opadajuće
}
sort(a.begin(), a.end(), mojKomparator);
Ako funkcija vraća
true, prvi element ide pre drugog.
Kako sort radi "ispod haube"
Funkcija sort() koristi veoma efikasan algoritam (Introsort),
čija je složenost u proseku O(n log n).
Introsort kombinuje QuickSort, HeapSort i InsertionSort kako bi bio brz i siguran.
Pregled važnih metoda vector-a
U ovom delu sumiramo najvažnije metode std::vector koje smo već koristili.
Većina ovih metoda je već objašnjena kroz primere — ovde služe kao brzi podsetnik.
Osnovne metode
| Metoda | Opis |
|---|---|
| push_back() | Dodaje element na kraj vector-a. |
| pop_back() | Uklanja poslednji element. |
| size() | Vraća broj elemenata. |
| capacity() | Vraća kapacitet (koliko elemenata može stati bez proširenja). |
| clear() | Briše sve elemente. |
| at() | Pristup elementu uz proveru granica. |
| front() | Vraća prvi element. |
| back() | Vraća poslednji element. |
| insert() | Ubacuje element na određenu poziciju. |
| erase() | Briše element na određenoj poziciji. |
Važne razlike koje moraš znati
[] vs at()
v[5]; // nema provere
v.at(5); // baca grešku ako indeks ne postoji
Koristi
at() kada želiš sigurnost, a [] kada želiš maksimalne performanse.
size() vs capacity()
vector<int> v = {1,2,3};
// size = 3
// capacity može biti npr. 4 ili 8
[1][2][3][_][_]
size=3, capacity=5
size() = broj elemenatacapacity() = rezervisan prostor u memoriji
Najčešće greške
- Korišćenje
[]van opsega - Pozivanje
front()iliback()nad praznim vector-om - Zaboravljanje da
insert()ierase()pomeraju elemente
Ako radiš sa iteratorima, pazi — neke operacije (npr. insert) mogu ih poništiti.
Kada koristiti vector?
- Kada ne znaš unapred veličinu podataka
- Kada često dodaješ elemente na kraj
- Kada ti treba brz pristup po indeksu
Praktični primeri rada sa vector-om
U ovom delu objedinjujemo sve što smo naučili kroz nekoliko smislenih primera.
Fokus ovih primera je na razumevanju načina korišćenja, a ne samo na sintaksi.
Deklaracija i inicijalizacija
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> brojevi = {1, 2, 3, 4, 5};
for (int broj : brojevi) {
cout << broj << " ";
}
return 0;
}
Ovaj način inicijalizacije ({}) zove se initializer list i veoma je praktičan.
Dodavanje i uklanjanje elemenata
vector<int> brojevi;
brojevi.push_back(10);
brojevi.push_back(20);
brojevi.push_back(30);
cout << "Pre brisanja: ";
for (int x : brojevi) cout << x << " ";
brojevi.pop_back();
cout << "\nPosle brisanja: ";
for (int x : brojevi) cout << x << " ";
push_back() može izazvati realokaciju (kopiranje elemenata u novu memoriju).
Iteracija – tri načina
1. Klasična for petlja
for (size_t i = 0; i < brojevi.size(); i++) {
cout << brojevi[i] << " ";
}
size_t je bezznakovni tip koji se koristi za veličine i indekse.
2. Range-based for
for (int x : brojevi) {
cout << x << " ";
}
3. Iterator
for (auto it = brojevi.begin(); it != brojevi.end(); ++it) {
cout << *it << " ";
}
Koji način koristiti?
- Range-based for → najjednostavniji (najčešće koristi)
- Indeksi → kada ti treba pozicija
- Iteratori → za napredne operacije (insert, erase)
Bitno: kopiranje vs referenca
for (int x : brojevi) // kopija
for (int& x : brojevi) // referenca (menja original)
for (const int& x : brojevi) // bez kopije, bez izmene
Najbolja praksa:
const T& kada samo čitaš podatke.
Zaključak
std::vector je jedan od najvažnijih kontejnera u C++ jer:
- automatski upravlja memorijom
- omogućava dinamičku veličinu
- ima brz pristup elementima (O(1))
Iako je veoma moćan, nije idealan za često ubacivanje elemenata na početak ili sredinu.
Napredne funkcionalnosti std::vector
U ovom delu fokusiramo se na ono što std::vector čini moćnim —
način upravljanja memorijom, umetanje i brisanje elemenata, kao i razliku između veličine i kapaciteta.
Dodavanje i umetanje elemenata
vector<int> brojevi = {10, 20, 30};
brojevi.push_back(40); // dodaje na kraj
brojevi.insert(brojevi.begin()+1, 15); // ubacuje na poziciju 1
insert() pomera sve elemente udesno → operacija je O(n).
Brisanje elemenata
vector<int> brojevi = {10, 20, 30, 40, 50};
brojevi.erase(brojevi.begin() + 2); // briše jedan element
brojevi.erase(brojevi.begin(), brojevi.begin()+2); // briše opseg
Nakon
erase(), svi elementi posle obrisanog se pomeraju ulevo.
⚠️ Iterator invalidation (vrlo važno)
Operacije kao što su insert() i erase() mogu učiniti postojeće iteratore nevažećim.
auto it = brojevi.begin();
brojevi.push_back(100);
// it možda više NE pokazuje na validno mesto!
Ako dođe do realokacije, svi iteratori postaju nevažeći.
Razlika između size() i capacity()
vector<int> v;
cout << v.size() << " " << v.capacity() << endl;
v.push_back(1);
v.push_back(2);
v.push_back(3);
cout << v.size() << " " << v.capacity() << endl;
- size() → broj elemenata
- capacity() → rezervisana memorija
Šta se dešava u memoriji?
Kada se vektor popuni, on:
- alocira novu (veću) memoriju
- kopira stare elemente
- briše staru memoriju
push_back() nije uvek O(1) — ali je amortizovano O(1).
Optimizacija: reserve()
vector<int> v;
v.reserve(100); // rezerviše memoriju unapred
Ako znaš unapred broj elemenata — koristi
reserve() da izbegneš kopiranja.
Kada koristiti vector?
- ✔ brz pristup elementima (O(1))
- ✔ dodavanje na kraj
- ❌ često ubacivanje u sredinu
Poređenje std::vector, std::array i std::list
C++ standardna biblioteka nudi više kontejnera za čuvanje podataka. Najčešće korišćeni su std::vector, std::array i std::list.
Ne postoji "najbolji" kontejner — izbor zavisi od problema koji rešavaš.
Poređenje ključnih osobina
| Osobina | std::vector | std::array | std::list |
|---|---|---|---|
| Veličina | Dinamička | Fiksna | Dinamička |
| Pristup elementima | O(1) | O(1) | O(n) |
| Dodavanje na kraj | Brzo (amortizovano O(1)) | Nije moguće | O(1) |
| Umetanje u sredinu | Sporo (O(n)) | Nije moguće | Brzo (O(1)) |
| Memorija | Kontinuirana (cache-friendly) | Kontinuirana | Rasuta (čvorovi) |
Šta ovo znači u praksi?
- vector → brz jer je memorija uzastopna (CPU cache)
- list → sporija jer skače po memoriji
Iako
std::list ima O(1) ubacivanje, u praksi je često sporiji od vector-a.
Kada koristiti koji kontejner?
Koristi std::vector kada:
- ✔ treba ti brz pristup elementima
- ✔ dodaješ elemente na kraj
- ✔ želiš najbolje performanse u većini slučajeva
Koristi std::array kada:
- ✔ znaš veličinu unapred
- ✔ želiš minimalan overhead
Koristi std::list kada:
- ✔ često ubacuješ/brišeš u sredini
- ✔ ne treba ti indeksiranje
Primer: zašto vector često pobeđuje list-u
vector<int> v = {1,2,3,4,5};
for(int x : v) cout << x;
Ovaj kod je brz jer se podaci nalaze u kontinualnoj memoriji.
list<int> l = {1,2,3,4,5};
for(int x : l) cout << x;
Ovde CPU mora da prati pokazivače → sporije izvršavanje.
Zaključak
- std::vector → podrazumevani izbor u 90% slučajeva
- std::array → kada je veličina poznata
- std::list → specijalni slučajevi
Ako nisi siguran — koristi
std::vector.
Efikasnost i realna upotreba std::vector
std::vector je jedan od najčešće korišćenih kontejnera u C++, ali kao i svaka struktura podataka,
ima svoje prednosti i ograničenja.
Cilj nije znati samo kako vector radi, već kada ga koristiti — a kada ne.
Prednosti vektora
| Osobina | Objašnjenje |
|---|---|
| Dinamička veličina | Automatski se proširuje tokom rada programa. |
| Brz pristup | Direktan pristup elementima (O(1)). |
| Cache-friendly | Elementi su u kontinualnoj memoriji → brže izvršavanje. |
| Laka upotreba | Jednostavan API (push_back, size, itd.). |
Nedostaci vektora
| Problem | Objašnjenje |
|---|---|
| Realokacija | Pri širenju dolazi do kopiranja elemenata u novu memoriju. |
| Umetanje u sredinu | Svi elementi se pomeraju → O(n). |
| Iterator invalidation | Iteratori mogu postati nevažeći nakon izmene. |
Kako ublažiti nedostatke?
vector<int> v;
v.reserve(100000); // rezerviše memoriju unapred
Ako znaš unapred broj elemenata — koristi
reserve() da izbegneš realokaciju.
Realan primer problema
vector<int> v;
for (int i = 0; i < 100000; i++) {
v.push_back(i);
}
Bez reserve(), vektor će se više puta proširivati i kopirati podatke.
Kada NE koristiti vector?
- ❌ često ubacivanje na početak (koristi
deque) - ❌ često ubacivanje u sredinu (koristi
list) - ❌ kada su iteratori kritični i ne smeju se menjati
Kada je vector najbolji izbor?
- ✔ obrada nizova podataka
- ✔ algoritmi (sortiranje, pretraga)
- ✔ kada treba brz pristup indeksima
std::vector je podrazumevani izbor u većini situacija.
Napredne teme
Pored osnovnih operacija, std::vector omogućava rad sa naprednijim konceptima kao što su iteratori, upravljanje memorijom (size i capacity) i višedimenzionalne strukture (2D vektori).
1. Iteratori
Iteratori omogućavaju efikasan prolazak kroz elemente bez korišćenja indeksa. Najčešće se koriste funkcije begin() i end().
#include <iostream>
#include <vector>
int main() {
std::vector<int> brojevi = {1, 2, 3, 4, 5};
for (auto it = brojevi.begin(); it != brojevi.end(); ++it) {
std::cout << *it << " ";
}
return 0;
}
Operator *it daje vrednost elementa na koji iterator pokazuje.
2. size() vs capacity()
size() predstavlja broj elemenata u vektoru, dok capacity() označava koliko elemenata može stati u trenutno alocirani prostor.
#include <iostream>
#include <vector>
int main() {
std::vector<int> v;
v.push_back(10);
v.push_back(20);
std::cout << "Size: " << v.size()
<< ", Capacity: " << v.capacity() << "\n";
v.reserve(100); // rezervacija memorije
std::cout << "Novi capacity: " << v.capacity() << "\n";
return 0;
}
Korišćenjem reserve() može se unapred alocirati memorija i smanjiti broj realokacija.
3. 2D vektori (vektor vektora)
Vektori mogu sadržati druge vektore, čime se dobija struktura slična matrici.
#include <iostream>
#include <vector>
int main() {
std::vector<std::vector<int>> matrica = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
for (size_t i = 0; i < matrica.size(); i++) {
for (size_t j = 0; j < matrica[i].size(); j++) {
std::cout << matrica[i][j] << " ";
}
std::cout << "\n";
}
return 0;
}
Prednost u odnosu na klasične 2D nizove je fleksibilnost – svaki red može imati različit broj elemenata.
Zaključak
Razumevanje iteratora, upravljanja memorijom i višedimenzionalnih struktura omogućava efikasnije korišćenje std::vector u složenijim programima.
Praktični zadaci
Sledeći zadaci služe za vežbu osnovnih operacija nad std::vector u C++, uključujući unos podataka, filtriranje i obradu elemenata.
1. Obrnuti ispis elemenata
Zadatak: Uneti n elemenata u vektor i ispisati ih obrnutim redosledom.
#include <iostream>
#include <vector>
int main() {
int n;
std::cout << "Unesite broj elemenata: ";
std::cin >> n;
std::vector<int> brojevi(n);
for (int i = 0; i < n; i++) {
std::cin >> brojevi[i];
}
std::cout << "Obrnuti redosled:\n";
for (int i = n - 1; i >= 0; i--) {
std::cout << brojevi[i] << " ";
}
return 0;
}
2. Filtriranje parnih brojeva
Zadatak: Iz postojećeg vektora izdvojiti sve parne brojeve u novi vektor.
#include <iostream>
#include <vector>
int main() {
std::vector<int> brojevi = {1,2,3,4,5,6,7,8};
std::vector<int> parni;
for (int x : brojevi) {
if (x % 2 == 0) {
parni.push_back(x);
}
}
for (int x : parni) {
std::cout << x << " ";
}
return 0;
}
3. Računanje proseka
Zadatak: Izračunati prosek elemenata u vektoru.
#include <iostream>
#include <vector>
int main() {
std::vector<int> brojevi = {10, 20, 30, 40, 50};
int suma = 0;
for (int x : brojevi) {
suma += x;
}
double prosek = static_cast<double>(suma) / brojevi.size();
std::cout << "Prosek: " << prosek << "\n";
return 0;
}
Zaključak
Ovi zadaci pokrivaju osnovne operacije nad vektorima: unos, prolazak kroz elemente, filtriranje i agregaciju. Preporučuje se dodatna vežba kroz modifikaciju zadataka (npr. validacija unosa ili rad sa većim skupovima podataka).
Dodavanje resursa
Kako biste dodatno proširili svoje znanje o vektorima i njihovoj upotrebi u C++, preporučujemo sledeće resurse. Ovi materijali pokrivaju osnovne i napredne teme kroz teoriju i praktične primere.
1. Zvanična dokumentacija
Zvanična C++ dokumentacija je najpouzdaniji izvor za detalje o metodama, funkcijama i primerima upotrebe vektora.
2. Online kursevi
Interaktivni kursevi koji pokrivaju C++ i rad sa STL kontejnerima:
3. Knjige
Preporučena literatura za učenje C++ i STL kontejnera:
- The C++ Programming Language – Bjarne Stroustrup
- Effective Modern C++ – Scott Meyers
- C++ Primer – Lippman, Lajoie, Moo
4. Tutorijali
Praktični vodiči i objašnjenja sa primerima:
5. Zajednice i diskusije
Forumi i zajednice gde možete postavljati pitanja i učiti iz realnih problema:
Zaključak
Kombinacija dokumentacije, kurseva, knjiga i praktične zajednice daje najbrži put ka savladavanju C++ vektora. Najbolji rezultati dolaze iz ravnoteže teorije i praktičnog rada.
|
Sledeće
Rečnik podataka-mape u C++ >| |