Uvod
Niz je niz istih vrsta objekata na uzastopnim memorijskim mjestima. Niz ne može povećati ili smanjiti rudu. Vektor je poput niza, ali njegova se duljina može povećati ili smanjiti. Vektor, dakle, ima mnogo više operacija nego niz.
C ++ ima mnogo knjižnica koje sve čine C ++ standardnu knjižnicu. Jedna od tih knjižnica je knjižnica spremnika. Spremnik je zbirka predmeta i na zbirci se mogu izvoditi određene radnje. C ++ spremnici mogu se grupirati u dva skupa: spremnici za sekvence i asocijativni spremnici. Spremnici sekvence su vektor, niz (nije isti niz o kojem smo prethodno razgovarali), deque, forward_list i list. To su različite zbirke (strukture podataka slične nizu) i svaka nudi različite kompromise.
Bilo koji programer trebao bi znati odlučiti hoće li koristiti vektor, niz, deque, forward_list ili popis. Kada programer treba strukturu koja zahtijeva više operacija od onih povezanih s običnim nizom, obični niz ne bi se trebao koristiti.
Ako zadatak uključuje česta umetanja i brisanja usred niza, tada treba koristiti popis ili prosljeđeni_popis. Ako zadatak uključuje česta umetanja i brisanja na početku ili na kraju niza, tada treba koristiti deque. Vektor treba koristiti kada ove vrste operacija nisu potrebne.
Ovaj vam članak pokazuje kako koristiti C ++ vektor. Za razumijevanje ovog članka trebat će vam neko znanje o C ++ pokazivačima, referencama i nizovima.
Klasa i predmeti
Klasa je skup varijabli i funkcija koje djeluju zajedno, gdje varijablama nisu dodijeljene vrijednosti. Kad su vrijednosti dodijeljene varijablama, klasa postaje objekt. Različite vrijednosti dane istoj klasi rezultiraju različitim objektima; to jest, različiti objekti mogu biti iste klase, ali imaju različite vrijednosti. Stvaranje objekta iz klase poznato je i kao instanciranje objekta.
Pojam vektor opisuje klasu. Objekt stvoren od vektora ima ime koje odabere programer.
Funkcija koja pripada klasi potrebna je za instanciranje objekta iz klase. U C ++-u ta funkcija ima isto ime kao i naziv klase. Različiti objekti stvoreni (instancirani) iz klase imaju različita imena koja je svakom od njih dao programer.
Stvaranje objekta iz klase znači konstrukciju objekta; to također znači instanciranje objekta.
Vektorska klasa
Vektorska klasa je već definirana i nalazi se u knjižnici. Da bi koristio vektorsku klasu, programer mora uključiti zaglavlje vektora u datoteku sa slijedećom smjernicom pretprocesiranja:
#includeJednom kad je zaglavlje uključeno, sve vektorske značajke (članovi podataka i funkcije člana) postaju dostupne. Da biste koristili objekt count za izlaz podataka na terminal (konzolu), zaglavlje objekta također mora biti uključeno. Da biste napisali program s vektorom, moraju biti uključena najmanje sljedeća zaglavlja:
#include#include
Instanciranje vektora
int foo [10];Iznad je deklaracija niza s imenom "foo" i brojem elemenata "10.”Ovo je niz cijelih brojeva. Deklaracija vektora je slična. Za vektor, broj elemenata nije obvezan, jer se duljina vektora može povećavati ili smanjivati.
U ovom trenutku u programu, vektorska klasa je već definirana u knjižnici i zaglavlje je uključeno. Instaliranje vektora može se izvršiti na sljedeći način:
std :: vektorOvdje je vektor posebne funkcije konstruktora. Vrsta podataka koje će vektor sadržavati je "int", u kutnim zagradama. Izraz "vtr" naziv je koji je programer odabrao za vektor. Konačno, "8", u zagradama, je okvirni broj cijelih brojeva koje će vektor imati.
Pojam "std" označava standardni prostor imena. U ovom kontekstu ovaj izraz mora slijediti dvostruko dvotočka. Svatko može napisati vlastitu knjižnicu vektorskih klasa i koristiti je. Međutim, C ++ već ima standardnu knjižnicu sa standardnim imenima, uključujući „vektor.”Da biste koristili standardni naziv, standardnom imenu mora prethoditi std :: . Da biste izbjegli tipkanje std :: svaki put u programu za standardno ime, programska datoteka može započeti na sljedeći način:
#include#include
pomoću prostora imena std;
Preopterećenje funkcije
Kad dva ili više različitih potpisa funkcije imaju isto ime, kaže se da je to ime preopterećeno. Kada se pozove jedna funkcija, broj i vrsta argumenata određuju koja će se funkcija izvršiti.
Konstruiranje vektora
Konstruiranje vektora znači instanciranje (stvaranje) vektorskog objekta. Funkcija konstruktora preopterećena je kako slijedi:
vektor
To stvara vektor duljine nula i upisujemo „T.”Sljedeća izjava stvara vektor nulte duljine tipa„ float ”s imenom„ vtr: ”
vektorvektor
Ovo stvara vektor s n elemenata tipa “T.”Izjava za ovaj vektor s četiri plutajuća elementa je sljedeća:
vektorvektor
To stvara vektor od n elemenata inicijaliziranih u vrijednost t. Sljedeća izjava stvara vektor od 5 elemenata, pri čemu svaki element ima vrijednost 3.4:
vektorKonstruiranje s inicijalizacijom
Vektor se može istovremeno konstruirati (stvoriti) i inicijalizirati na jedan od sljedeća dva načina:
vektorIli
vektorImajte na umu da nema zagrada neposredno nakon naziva objekta. Zagrade koje se koriste neposredno nakon naziva objekta trebale bi imati popis inicijalizatora, kako slijedi:
vektorVektor se može konstruirati i inicijalizirati kasnije s popisom inicijalizatora. U tom se slučaju zagrade neće koristiti:
vektorvtr = 1.1, 2.2, 3.3, 4.4;
vektor
Ovo je konstruktor kopija. Stvara vektor V2 kao kopiju vektora V1. Sljedeći kod to ilustrira:
vektorvektor
Dodjeljivanje vektora tijekom gradnje
Tijekom gradnje može se stvoriti prazan vektor dok mu se dodjeljuje drugi, kako slijedi:
vektorvektor
Druga je izjava ekvivalentna:
vektorconst Vector
Const vektor je vektor čiji se elementi ne mogu mijenjati. Vrijednosti u ovom vektoru su samo za čitanje. Kada se stvori, vektor se pojavljuje na sljedeći način:
const vektorU ovom vektorskom tipu nijedan se element ne može dodati ili ukloniti. Štoviše, nijedna se vrijednost ne može promijeniti.
Konstruiranje s Iteratorom
Predložak pruža generički prikaz za vrstu podataka. Iterator pruža generički prikaz skeniranja kroz vrijednosti spremnika. Sintaksa za stvaranje vektora s iteratorom je sljedeća:
predložakvektor (prvi InputIterator, zadnji InputIterator, const Allocator & = Allocator ());
Ovo konstruira vektor za raspon [prvi, zadnji) pomoću navedenog alokatora, o čemu će biti riječi kasnije u ovom članku.
Uništavanje vektora
Da biste uništili vektor, jednostavno mu dopustite da izađe iz opsega i uništavanje se obrađuje automatski.
Kapacitet vektora
size_type kapacitet () const noexcept
Funkcija člana kapaciteta vraća ukupni broj elemenata koje vektor može držati bez potrebe za preraspodjelom. Segment koda za to je sljedeći:
vektorint num = vtr.kapacitet();
cout << num << '\n';
Izlaz je 4.
pričuva (n)
Prostor memorije nije uvijek slobodno dostupan. Dodatni prostor možete rezervirati unaprijed. Razmotrite sljedeći segment koda:
vektorvtr.rezerva (6);
cout << vtr.capacity() << '\n';
Izlaz je 6. Dakle, dodatni rezervirani prostor je 6 - 4 = 2 elementa. Funkcija vraća void.
veličina () const noexcept
To vraća broj elemenata u vektoru. Sljedeći kod ilustrira ovu funkciju:
vektorplutajuće sz = vtr.veličina();
cout << sz << '\n';
Izlaz je 4.
smanjiti da stane()
Nakon što vektoru dodijelite dodatni kapacitet pomoću funkcije reserve (), vektor se može umanjiti tako da odgovara njegovoj izvornoj veličini. Sljedeći kod to ilustrira:
vektorvtr.rezerva (6);
vtr.smanjiti da stane();
int sz = vtr.veličina();
cout << sz << '\n';
Izlaz je 4, a ne 6. Funkcija vraća void.
promjena veličine (sz), promjena veličine (sz, c)
Ovo mijenja veličinu vektora. Ako je nova veličina manja od stare, elementi se prema kraju brišu. Ako je nova veličina dulja, tada se pred kraj dodaje neka zadana vrijednost. Da biste dodali određenu vrijednost, upotrijebite funkciju resize () s dva argumenta. Sljedeći segment koda ilustrira upotrebu ove dvije funkcije:
vektorvtr1.promjena veličine (2);
cout << "New size of vtr1: " << vtr1.size() << '\n';
vektor
vtr2.promjena veličine (4, 8.8);
cout << "vtr2: "<< vtr2[0] <<" "<< vtr2[1] <<"
"<< vtr2[2] <<" "<< vtr2[3] << '\n';
Rezultat je sljedeći:
Nova veličina vtr1: 2vtr2: 1.1 2.2 8.8 8.8
Funkcije se vraćaju ništavne.
prazno () const noexcept
Ova funkcija vraća 1 za true ako u vektoru nema elemenata i 0 za false ako je vektor prazan. Ako vektor ima 4 mjesta za određenu vrstu podataka, poput plutajuće, bez ikakve plutajuće vrijednosti, tada taj vektor nije prazan. Sljedeći kod to ilustrira:
vektorcout << vtr.empty() << '\n';
vektor
cout << vt.empty() << '\n';
vektor
cout << v.empty() << '\n';
Rezultat je sljedeći:
10
0
Pristup vektorskim elementima
Vektor se može podkriptirati (indeksirati) poput niza. Brojanje indeksa započinje od nule.
ime vektora [i]
Operacija "vectorName [i]" vraća referencu na element na ith indeks vektora. Sljedeći izlazni kod 3.3 za gornji vektor:
vektorplutajuće fl = vtr [2];
cout << fl << '\n';
vectorName [i] const
Operacija „vectorName [i] const“ izvršava se umjesto „vectorName [i]“ kada je vektor konstantan vektor. Ova se operacija koristi u sljedećem kodu:
const vektorplutajuće fl = vtr [2];
cout << fl << '\n';
Izraz vraća konstantnu referencu na ith element vektora.
Dodjeljivanje vrijednosti s indeksom
Vrijednost se može dodijeliti nestalnom vektoru, kako slijedi:
vektorvtr [2] = 8.8;
cout << vtr[2] << '\n';
Izlaz je 8.8.
ime vektora.u (i)
“VektorName.at (i) "je poput" vectorName [i] ", ali" vectorName.at (i) ”je pouzdaniji. Sljedeći kod pokazuje kako treba koristiti ovaj vektor:
vektorplutati fl = vtr.na (2);
cout << fl << '\n';
at () je funkcija člana vektora.
ime vektora.na (i) const
“VektorName.at (i) const "je poput" vectorName [i] const ", ali" vectorName.at (i) const “je pouzdaniji. “VektorName.at (i) const "izvršava se umjesto" vectorName.at (i) ”kada je vektor konstantan vektor. Ovaj se vektor koristi u sljedećem kodu:
const vektorplutati fl = vtr.na (2);
cout << fl << '\n';
at () const je funkcija člana vektora.
Dodjeljivanje vrijednosti funkcijom at ()
Vrijednost se može dodijeliti nestalnom vektoru s funkcijom at (), kako slijedi:
vektorvtr.pri (2) = 8.8;
cout << vtr[2] << '\n';
Izlaz je 8.8.
Problem s potkriptiranjem
Problem s potkriptiranjem (indeksiranjem) je taj što se, ako je indeks izvan opsega, može vratiti nula ili se u vrijeme izvođenja može pojaviti pogreška.
ispred()
To vraća referencu na prvi element vektora bez uklanjanja elementa. Izlaz sljedećeg koda je 1.1.
vektorplutati fl = vtr.ispred();
cout << fl << '\n';
Element se ne uklanja iz vektora.
prednja () const
Kada vektorskoj konstrukciji prethodi const, umjesto "front () izvršava se izraz" front () const ".”To se koristi u sljedećem kodu:
const vektorplutati fl = vtr.ispred();
cout << fl << '\n';
Vraća se konstantna referenca. Element se ne uklanja iz vektora.
leđa()
To vraća referencu na zadnji element vektora bez uklanjanja elementa. Izlaz sljedećeg koda je 4.4.
vektorplutati fl = vtr.leđa();
cout << fl << '\n';
povratak () const
Kada vektorskoj konstrukciji prethodi const, umjesto "back () izvršava se izraz" back () const ".”To se koristi u sljedećem kodu:
const vektorplutati fl = vtr.leđa();
cout << fl << '\n';
Vraća se konstantna referenca. Element se ne uklanja iz vektora.
Pristup vektorskim podacima
data () noexcept; data () const noexcept;
Bilo koji od ovih vraća pokazivač tako da je [data (), data () + size ()) važeći raspon.
Ovo će biti detaljnije obrađeno kasnije u članku.
Povratak iteratora i vektora
Iterator je poput pokazivača, ali ima više funkcionalnosti od pokazivača.
begin () noexcept
Vraća iterator koji pokazuje na prvi element vektora, kao u sljedećem segmentu koda:
vektorvektor
cout << *iter << '\n';
Izlaz je 1.1. Imajte na umu da je deklaracija koja prima iterator deklarirana. Iterator se dereferencira u povratnom izrazu kako bi se dobila vrijednost na isti način na koji se dereferencira pokazivač.
begin () const noexcept;
Vraća iterator koji pokazuje na prvi element vektora. Kada vektorskoj konstrukciji prethodi const, umjesto "begin () izvršava se izraz" begin () const ".”Pod ovim uvjetom, odgovarajući element u vektoru ne može se mijenjati. To se koristi u sljedećem kodu:
const vektorvektor
cout << *iter << '\n';
Izlaz je 1.1. Imajte na umu da je ovaj put korišten "const_iterator" umjesto samo "iterator" za primanje vraćenog iteratora.
kraj () noexcept
Vraća iterator koji usmjerava neposredno iza zadnjeg elementa vektora. Razmotrite sljedeći segment koda:
vektorvektor
cout << *iter << '\n';
Izlaz je 0, što je besmisleno, jer nema konkretnog elementa izvan posljednjeg elementa.
end () const noexcept
Vraća iterator koji usmjerava neposredno iza zadnjeg elementa vektora. Kada je vektorskoj konstrukciji prethodilo "const", umjesto "end () izvršava se izraz" end () const ".”Razmotrite sljedeći segment koda:
const vektorvektor
cout << *iter << '\n';
Izlaz je 0. Imajte na umu da je ovaj put korišten "const_iterator" umjesto samo "iterator" za primanje vraćenog iteratora.
Obrnuta iteracija
Moguće je imati iterator koji se ponavlja od kraja do neposredno prije prvog elementa.
rbegin () ne izuzev
Vraća iterator koji pokazuje na posljednji element vektora, kao u sljedećem segmentu koda:
vektorvektor
cout << *rIter << '\n';
Izlaz je 4.4.
Imajte na umu da je deklaracija koja prima obrnuti iterator deklarirana. Iterator se dereferencira u povratnom izrazu kako bi se dobila vrijednost na isti način na koji se dereferencira pokazivač.
rbegin () const noexcept;
Vraća iterator koji pokazuje na posljednji element vektora. Kada je vektorskoj konstrukciji prethodilo "const", umjesto "rbegin () izvršava se izraz" rbegin () const ".”Pod ovim uvjetom, odgovarajući element u vektoru ne može se mijenjati. Ova se značajka koristi u sljedećem kodu:
const vektorvektor
cout << *rIter << '\n';
Izlaz je 4.4.
Imajte na umu da je const_reverse_iterator ovaj put korišten, umjesto samo reverse_iterator, za primanje vraćenog iteratora.
rend () noexcept
Vraća iterator koji pokazuje neposredno prije prvog elementa vektora. Razmotrite sljedeći segment koda:
vektorvektor
cout << *rIter << '\n';
Izlaz je 0, što je besmisleno, jer nema konkretnog elementa neposredno prije prvog elementa.
rend () const noexcept
Vraća iterator koji pokazuje neposredno prije prvog elementa vektora. Kada je vektorskoj konstrukciji prethodilo "const", umjesto "rend () izvršava se izraz" rend () const ".”Razmotrite sljedeći segment koda:
const vektorvektor
cout << *rIter << '\n';
Izlaz je 0.
Imajte na umu da je const_reverse_iterator ovaj put korišten, umjesto samo reverse_iterator, za primanje vraćenog iteratora.
Vektorski modifikatori
Modifikator koji modificira vektor može uzeti ili vratiti iterator.
a.mjesto (p, argumenti)
Umeće objekt tipa T konstruiran sa std :: forward
umetanje (iteratorPosition, vrijednost)
Umeta kopiju vrijednosti na poziciji iteratora vektora. Vraća iterator (položaj) u vektoru gdje je postavljena kopija. Sljedeći kod pokazuje gdje je postavljena vrijednost:
vektorvektor
++iter;
++iter;
vtr.umetak (iter, 25);
cout << vtr[1] << " << vtr[2]<< '
' << vtr[3] << '\n';
Izlaz je: 20 25 30.
Imajte na umu da je iterator bio napredan (uvećan) baš poput pokazivača.
Popis inicijalizatora također se može umetnuti, kao što ilustrira sljedeći kod:
vektorvektor
++iter;
++iter;
vtr.umetak (iter, 25, 28);
cout << vtr[1] << " << vtr[2]<< '
' << vtr[3]<< " << vtr[4] << '\n';
Izlaz je: 20 25 28 30.
izbrisati (položaj)
Uklanja element na položaju na koji ukazuje iterator, a zatim vraća položaj iteratora. Sljedeći kod to ilustrira:
vektorvektor
++iter;
++iter;
vtr.izbrisati (iter);
cout << vtr[0] << " << vtr[1] << '
' << vtr[2]<< '\n';
Izlaz je: 10 20 40
push_back (t), push_back (rv)
Koristi se za dodavanje jednog elementa na kraj vektora. Upotrijebite push_back (t) na sljedeći način:
vektorvtr.push_back (5.5);
plutajuće fl = vtr [4];
cout << fl << '\n';
Izlaz je 5.5.
push_back (rv): - vidi kasnije.pop_back ()
Uklanja posljednji element bez vraćanja. Veličina vektora smanjena je za 1. Sljedeći kod to ilustrira:
vektorvtr.pop_back ();
plutajuće sz = vtr.veličina();
cout << sz << '\n';
Izlaz je 3.
a.zamijeniti (b)
Dva se vektora mogu zamijeniti, kao što je prikazano u sljedećem segmentu koda:
vektorvektor
vtr1.zamijeniti (vtr2);
cout << "vtr1: "<< vtr1[0] <<" "<< vtr1[1] <<"
"<< vtr1[2] <<" "<< vtr1[3] << '\n';
cout << "vtr2: "<< vtr2[0] <<" "<< vtr2[1] <<"
"<< vtr2[2] <<" "<< vtr2[3] << '\n';
Izlaz je:
vtr1: 10 20 0 0vtr2: 1.1 2.2 3.3 4.4
Ako je potrebno, dužina vektora se povećava. Također, vrijednosti koje nisu imale zamjenu zamjenjuju se nekim zadanim vrijednostima.
čisto()
Uklanja sve elemente iz vektora, kao što ilustrira sljedeći segment koda:
vektorvtr.čisto();
cout << vtr.size() << '\n';
Izlaz je 0.
Operatori jednakosti i relacije za vektore
Operator ==
Vraća 1 za true ako su dva vektora jednake veličine i ako su odgovarajući elementi jednaki; u suprotnom, vraća 0 za false. Na primjer:
vektorvektor
bool bl = U == V;
cout << bl << '\n';
Izlaz je 0.
The != Operator
Vraća 1 za true ako dva vektora nemaju jednaku veličinu i / ili odgovarajući elementi nisu jednaki; u suprotnom, vraća 0 za false. Na primjer:
vektorvektor
bool bl = U!= V;
cout << bl << '\n';
Izlaz je 1.
The < Operator
Vraća 1 za true ako je prvi vektor početni podskup drugog vektora, s tim što su elementi dvaju jednakih dijelova isti i istim redoslijedom. Ako su oba vektora iste veličine i kreću se slijeva udesno i ako se u prvom vektoru nađe element koji je manji od odgovarajućeg elementa u drugom vektoru, tada će se 1 i dalje vratiti. U suprotnom, vraća se 0 za false. Na primjer:
vektorvektor
bool bl = U
Izlaz je 1. < does not include the case when the size and order are the same.
> Operator
Povrat !(U < V), where U is the first vector and V is the second vector, according to the above definitions.
The <= Operator
Vraća U <= V, where U is the first vector and V is the second vector, according to the above definitions.
Operator> =
Povrat !(U <= V), where U is the first vector and V is the second vector, according to the above definitions.
Zaključak
Vektor je primjer spremnika niza. Vektor je "bolji" oblik običnog niza i instanciran je iz klase. Vektori imaju metode koje se klasificiraju pod: konstrukcija i dodjela, kapacitet, pristup elementima, pristup podacima, iteratori, modifikatori i numerički preopterećeni operatori.
Postoje i drugi spremnici sljedova, nazvani list, forward_list i array. Ako zadatak uključuje česta umetanja i brisanja usred niza, tada treba koristiti popis ili prosljeđeni_popis. Ako zadatak uključuje česta umetanja i brisanja na početku ili na kraju slijeda, tada treba koristiti deque. Dakle, vektore treba koristiti samo kad takve vrste operacija nisu važne.