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.

Napomena:

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:

  1. alocira veću memoriju (obično duplo veću)
  2. kopira stare elemente
  3. oslobađa staru memoriju
Tip:

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.

Napomena:

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)
Važno:

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).

Napomena:

Kao i kod nizova, ne postoji automatska provera granica kod operatora []. Za sigurniji pristup koristi a.at(3).
Tip:

Ako pristupiš nepostojećem indeksu pomoću [], program može imati nepredvidivo ponašanje (greške koje je teško pronaći).

Mini izazov

Napravi vector od 5 celih brojeva i ispiši prvi i poslednji element.

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;
}
  
Napomena:

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.

Tip:

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);
  
Važno:

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;
}
  
Tip:

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;
  
Napomena:

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;
  
Razlika:

[] 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
  
Tip:

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}
  
Napomena:

Elementi nakon mesta ubacivanja pomeraju se udesno.

Mini izazov

Napravi vector i ubaci broj 100 na treću poziciju bez brisanja postojećih elemenata.

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
  
Napomena:

Metoda pop_back() ne vraća obrisanu vrednost — samo uklanja poslednji element.
Tip:

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
  
Važno:

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.

Tip:

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.

Važno:

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
  
Tip:

Moderniji način je korišćenje range-based for petlje: for (int x : brojevi)

Mini izazov

Napravi vector od 6 brojeva, obriši treći element i ispiši rezultat.

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;
}
  
Napomena:

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).
Tip:

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;
  
Napomena:

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
  
Tip:

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 << " ";
}
  
Objašnjenje:

const string& rec znači:
  • const – ne menjamo vrednost
  • & – koristimo referencu (bez kopiranja)
  • rec – trenutni element

Mini izazov

Učitaj reči u vector i ispiši samo one koje imaju više od 5 karaktera.

Testirajte svoj kod ovde!

// Ovde pišite C++ kod...

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.

Važno:

Iterator ne sadrži vrednost, već adresu elementa (kao pointer).

begin() i end()

  • begin() – vraća iterator na prvi element
  • end() – vraća iterator koji pokazuje iza poslednjeg elementa

[5] [3] [5] [7] [8]
                  ^
                 end()
  
Tip:

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 << " ";
}
  
Objašnjenje:

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);
  
Tip:

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).

Zanimljivost:

Introsort kombinuje QuickSort, HeapSort i InsertionSort kako bi bio brz i siguran.

Mini izazov

Sortiraj vector tako da prvo budu parni, pa neparni brojevi.

Pregled važnih metoda vector-a

U ovom delu sumiramo najvažnije metode std::vector koje smo već koristili.

Napomena:

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
  
Tip:

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
  
Važno:

size() = broj elemenata
capacity() = rezervisan prostor u memoriji

Najčešće greške

  • Korišćenje [] van opsega
  • Pozivanje front() ili back() nad praznim vector-om
  • Zaboravljanje da insert() i erase() pomeraju elemente
Tip:

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

Zadatak za razmišljanje

Šta se dešava sa performansama ako često ubacuješ elemente na početak vector-a?

Praktični primeri rada sa vector-om

U ovom delu objedinjujemo sve što smo naučili kroz nekoliko smislenih primera.

Napomena:

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;
}
  
Tip:

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 << " ";
  
Važno:

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] << " ";
}
  
Objašnjenje:

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
  
Tip:

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))
Važno:

Iako je veoma moćan, nije idealan za često ubacivanje elemenata na početak ili sredinu.

Zadatak za razmišljanje

Zašto je ubacivanje na početak vector-a sporo?

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
  
Važno:

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
  
Napomena:

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!
  
Važno:

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:

  1. alocira novu (veću) memoriju
  2. kopira stare elemente
  3. briše staru memoriju
Posledica:

push_back() nije uvek O(1) — ali je amortizovano O(1).

Optimizacija: reserve()


vector<int> v;
v.reserve(100); // rezerviše memoriju unapred
  
Tip:

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

Mini izazov

Šta će biti brže: dodavanje 1000 elemenata bez reserve() ili sa njim?

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.

Važno:

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
Bitno:

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
Tip:

Ako nisi siguran — koristi std::vector.

Pitanje za razmišljanje

Zašto je std::vector često brži od std::list iako ima lošiju teorijsku složenost?

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.

Važno:

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
  
Tip:

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
Zaključak:

std::vector je podrazumevani izbor u većini situacija.

Pitanje za razmišljanje

Zašto je std::vector često brži od std::list, iako ima lošiju složenost za ubacivanje?

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.


​Prethodno
​|<Nizovi u jeziku C++
Sledeće
​​​​Rečnik podataka-mape u C++>|