Uvod
Matrika je vrsta istih predmetnih vrst v zaporednih pomnilniških mestih. Niz ne more povečati ali zmanjšati dolžine rude. Vektor je kot matrika, vendar je njegovo dolžino mogoče povečati ali zmanjšati. Vektor ima zato veliko več operacij kot matrika.
C ++ ima veliko knjižnic, ki vse tvorijo standardno knjižnico C ++. Ena od teh knjižnic je knjižnica vsebnikov. Vsebnik je zbirka predmetov in na zbirki je mogoče izvajati določene operacije. Zabojnike C ++ lahko razvrstimo v dva sklopa: zabojnike za zaporedje in asociacijske vsebnike. Zabojniki zaporedja so vektor, matrika (ni ista matrika, o kateri smo že govorili), deque, forward_list in list. To so različne zbirke (strukturi podatkov podobne matriki) in vsaka ponuja različne kompromise.
Vsak programer bi se moral odločiti, ali bo uporabil vektor, matriko, deque, forward_list ali seznam. Ko programer potrebuje strukturo, ki zahteva več operacij kot tistih, povezanih z navadnim nizom, navadnega polja ne bi smeli uporabljati.
Če opravilo vključuje pogoste vstavitve in brisanja sredi zaporedja, je treba uporabiti seznam ali naprej_list. Če naloga vključuje pogoste vstavitve in brisanja na začetku ali koncu zaporedja, je treba uporabiti deque. Kadar tovrstne operacije niso potrebne, je treba uporabiti vektor.
V tem članku je razloženo, kako uporabljati vektor C ++. Za razumevanje tega članka boste potrebovali nekaj znanja o kazalcih, referencah in nizih C ++.
Razred in predmeti
Razred je nabor spremenljivk in funkcij, ki delujejo skupaj, pri čemer spremenljivkam niso dodeljene vrednosti. Ko so spremenljivkam dodeljene vrednosti, razred postane objekt. Različne vrednosti, dane istemu razredu, povzročajo različne predmete; to pomeni, da so lahko različni predmeti istega razreda, vendar imajo različne vrednosti. Ustvarjanje predmeta iz razreda je znano tudi kot instanciranje predmeta.
Izraz vektor opisuje razred. Predmet, ustvarjen iz vektorja, ima ime, ki ga izbere programer.
Funkcija, ki pripada razredu, je potrebna za primerek predmeta iz razreda. V C ++ ima ta funkcija enako ime kot ime razreda. Različni predmeti, ustvarjeni (primerki) iz razreda, imajo različna imena, ki jih programer dodeli vsakemu od njih.
Ustvarjanje predmeta iz razreda pomeni konstruiranje predmeta; to pomeni tudi instanciranje predmeta.
Vektorski razred
Vektorski razred je že definiran in je v knjižnici. Če želite uporabiti vektorski razred, mora programer v datoteko vključiti glavo vektorja z naslednjo direktivo o predhodni obdelavi:
#includeKo je vključena glava, postanejo dostopne vse vektorske funkcije (podatki in člani). Če želite uporabiti predmet štetja za izhod podatkov na terminal (konzolo), mora biti vključena tudi glava predmeta. Če želite napisati program z vektorjem, morate vključiti vsaj naslednje glave:
#include#include
Prenos vektorja
int foo [10];Zgoraj je deklaracija matrike z imenom "foo" in številom elementov "10.”To je vrsta celih števil. Izjava vektorja je podobna. Za vektor je število elementov neobvezno, saj se lahko dolžina vektorja poveča ali zmanjša.
Na tej točki v programu je bil vektorski razred že definiran v knjižnici in vključena je glava. Primerek vektorja je mogoč na naslednji način:
std :: vektorTu je vektor posebne konstruktorske funkcije. Vrsta podatkov, ki jih bo imel vektor, je v oglatih oklepajih "int". Izraz "vtr" je ime, ki ga je programer izbral za vektor. Na koncu je »8« v oklepajih okvirno število celih števil, ki jih bo imel vektor.
Izraz "std" pomeni standardni imenski prostor. V tem kontekstu mora temu izrazu slediti dvojno dvopičje. Vsakdo lahko napiše svojo knjižnico vektorskih razredov in jo uporabi. Vendar ima C ++ že standardno knjižnico s standardnimi imeni, vključno z “vektorjem."Če želite uporabiti standardno ime, mora biti pred standardnim imenom std :: . Da se izognete tipkanju std :: vsakič, ko v programu vnesete standardno ime, se programska datoteka lahko zažene na naslednji način:
#include#include
uporaba imenskega prostora std;
Preobremenitev funkcije
Če imata dva ali več različnih podpisov funkcij isto ime, naj bi bilo to ime preobremenjeno. Ko pokličete eno funkcijo, število in vrsta argumentov določita, katera funkcija se izvede.
Konstruiranje vektorja
Konstruiranje vektorja pomeni instanciranje (ustvarjanje) vektorskega predmeta. Funkcija konstruktorja je preobremenjena na naslednji način:
vektor
To ustvari vektor dolžine nič in vtipkajte „T."Naslednji stavek ustvari vektor ničelne dolžine tipa" float "z imenom" vtr: "
vektorvektor
To ustvari vektor z n elementi tipa „T."Izjava za ta vektor s štirimi float elementi je naslednja:
vektorvektor
To ustvari vektor iz n elementov, inicializiranih na vrednost t. Naslednji stavek ustvari vektor 5 elementov, pri čemer ima vsak element vrednost 3.4:
vektorKonstruiranje z inicializacijo
Vektor je mogoče zgraditi (ustvariti) in inicializirati hkrati na enega od naslednjih dveh načinov:
vektorAli
vektorUpoštevajte, da takoj za imenom predmeta ni oklepajev. V oklepajih, ki se uporabljajo tik za imenom predmeta, mora biti seznam inicializatorjev, kot sledi:
vektorVektor je mogoče zgraditi in inicializirati pozneje s seznamom inicializatorja. V tem primeru oklepaji ne bodo uporabljeni:
vektorvtr = 1.1, 2.2, 3.3, 4.4;
vektor
To je konstruktor kopij. Ustvari vektor V2 kot kopijo vektorja V1. Naslednja koda to ponazarja:
vektorvektor
Dodelitev vektorja med gradnjo
Med gradnjo lahko ustvarite prazen vektor, medtem ko mu je dodeljen drug, kot sledi:
vektorvektor
Druga izjava je enakovredna:
vektorconst Vector
Const vektor je vektor, katerega elementov ni mogoče spremeniti. Vrednosti v tem vektorju so samo za branje. Ko je ustvarjen, se vektor prikaže na naslednji način:
const vektorPri tej vektorski vrsti nobenega elementa ni mogoče dodati ali odstraniti. Poleg tega nobene vrednosti ni mogoče spremeniti.
Konstruiranje z Iteratorjem
Predloga zagotavlja generično predstavitev za podatkovni tip. Iterator zagotavlja splošno predstavitev skeniranja skozi vrednosti vsebnika. Sintaksa za ustvarjanje vektorja s ponoviteljem je naslednja:
predlogavektor (InputIterator prvi, InputIterator zadnji, const Allocator & = Allocator ());
S tem se izdela vektor za obseg [prvi, zadnji) z uporabo določenega razdeljevalca, ki bo obravnavan kasneje v tem članku.
Uničenje vektorja
Če želite uničiti vektor, preprosto dovolite, da izstopi iz obsega, in uničenje se obdeluje samodejno.
Vektorska zmogljivost
size_type capacity () const noexcept
Funkcija člana kapacitete vrne skupno število elementov, ki jih vektor lahko zadrži, ne da bi bilo treba prerazporediti. Kodni segment za to je naslednji:
vektorint num = vtr.zmogljivost ();
cout << num << '\n';
Izhod je 4.
rezerva (n)
Prostor za pomnilnik ni vedno prosto dostopen. Dodatni prostor lahko rezervirate vnaprej. Upoštevajte naslednji segment kode:
vektorvtr.rezerva (6);
cout << vtr.capacity() << '\n';
Izhod je 6. Torej, dodaten rezerviran prostor je 6 - 4 = 2 elementa. Funkcija vrne void.
size () const noexcept
To vrne število elementov v vektorju. Naslednja koda ponazarja to funkcijo:
vektorplovec sz = vtr.velikost ();
cout << sz << '\n';
Izhod je 4.
shrink_to_fit ()
Potem ko vektorju s funkcijo reserve () dodelite dodatno zmogljivost, lahko vektor pomanjšate tako, da ustreza njegovi prvotni velikosti. Naslednja koda to ponazarja:
vektorvtr.rezerva (6);
vtr.shrink_to_fit ();
int sz = vtr.velikost ();
cout << sz << '\n';
Izhod je 4 in ne 6. Funkcija vrne void.
velikost (sz), velikost (sz, c)
S tem spremenite velikost vektorja. Če je nova velikost manjša od stare, se elementi proti koncu izbrišejo. Če je nova velikost daljša, se proti koncu doda privzeta vrednost. Če želite dodati določeno vrednost, uporabite funkcijo resize () z dvema argumentoma. Naslednji segment kode ponazarja uporabo teh dveh funkcij:
vektorvtr1.velikost (2);
cout << "New size of vtr1: " << vtr1.size() << '\n';
vektor
vtr2.velikost (4, 8.8);
cout << "vtr2: "<< vtr2[0] <<" "<< vtr2[1] <<"
"<< vtr2[2] <<" "<< vtr2[3] << '\n';
Rezultat je naslednji:
Nova velikost vtr1: 2vtr2: 1.1 2.2 8.8 8.8
Funkcije se vrnejo v prazno.
prazno () const noexcept
Ta funkcija vrne 1 za true, če v vektorju ni elementov in 0 za false, če je vektor prazen. Če ima vektor 4 lokacije za določeno vrsto podatkov, na primer float, brez kakršne koli float vrednosti, potem ta vektor ni prazen. Naslednja koda to ponazarja:
vektorcout << vtr.empty() << '\n';
vektor
cout << vt.empty() << '\n';
vektor
cout << v.empty() << '\n';
Rezultat je naslednji:
10
0
Dostop do vektorskih elementov
Vektor lahko podpišemo (indeksiramo) kot matriko. Štetje indeksa se začne od nič.
vectorName [i]
Operacija “vectorName [i]” vrne sklic na element na ith indeks vektorja. Naslednja izhodna koda 3.3 za zgornji vektor:
vektorfloat fl = vtr [2];
cout << fl << '\n';
vectorName [i] const
Operacija “vectorName [i] const” se izvede namesto “vectorName [i]”, kadar je vektor konstantni vektor. Ta postopek se uporablja v naslednji kodi:
const vektorfloat fl = vtr [2];
cout << fl << '\n';
Izraz vrne konstantno sklicevanje na ith element vektorja.
Dodelitev vrednosti s podpisom
Vrednost je mogoče dodeliti nestalnemu vektorju, kot sledi:
vektorvtr [2] = 8.8;
cout << vtr[2] << '\n';
Izhod je 8.8.
vectorName.ob (i)
“VektorName.at (i) "je kot" vectorName [i] ", vendar" vectorName.at (i) "je bolj zanesljiv. Naslednja koda prikazuje, kako je treba uporabiti ta vektor:
vektorfloat fl = vtr.pri (2);
cout << fl << '\n';
at () je vektorska funkcija člana.
vectorName.pri (i) const
“VektorName.at (i) const "je kot" vectorName [i] const ", vendar" vectorName.at (i) const "je bolj zanesljiv. “VektorName.at (i) const "se izvede namesto" vectorName.pri (i) ", ko je vektor konstantni vektor. Ta vektor se uporablja v naslednji kodi:
const vektorfloat fl = vtr.pri (2);
cout << fl << '\n';
at () const je vektorska funkcija člana.
Dodelitev vrednosti s funkcijo at ()
Vrednost je mogoče dodeliti nestalnemu vektorju s funkcijo at (), kot sledi:
vektorvtr.pri (2) = 8.8;
cout << vtr[2] << '\n';
Izhod je 8.8.
Težava s pod-skriptiranjem
Težava pri pod-skriptiranju (indeksiranju) je, da če je indeks izven obsega, se lahko vrne nič ali se med izvajanjem izda napaka.
spredaj ()
To vrne sklic na prvi element vektorja, ne da bi ga odstranili. Rezultat naslednje kode je 1.1.
vektorfloat fl = vtr.spredaj ();
cout << fl << '\n';
Element ni odstranjen iz vektorja.
spredaj () const
Kadar je pred vektorsko konstrukcijo const, se namesto „front () izvede izraz“ front () const ”."To se uporablja v naslednji kodi:
const vektorfloat fl = vtr.spredaj ();
cout << fl << '\n';
Vrne se stalna referenca. Element ni odstranjen iz vektorja.
nazaj ()
To vrne sklic na zadnji element vektorja, ne da bi ga odstranili. Rezultat naslednje kode je 4.4.
vektorfloat fl = vtr.nazaj ();
cout << fl << '\n';
back () const
Kadar je pred vektorsko konstrukcijo const, se namesto „back () izvede izraz" back () const "."To se uporablja v naslednji kodi:
const vektorfloat fl = vtr.nazaj ();
cout << fl << '\n';
Vrne se stalna referenca. Element ni odstranjen iz vektorja.
Dostop do vektorskih podatkov
data () noexcept; data () const noexcept;
Vsako od teh vrne kazalec, tako da je [data (), data () + size ()) veljaven obseg.
To bo podrobneje zajeto v nadaljevanju članka.
Vrnitev iteratorjev in vektor
Ponavljalec je kot kazalec, vendar ima več funkcionalnosti kot kazalec.
begin () noexcept
Vrne iterator, ki kaže na prvi element vektorja, kot v naslednjem segmentu kode:
vektorvektor
cout << *iter << '\n';
Izhod je 1.1. Upoštevajte, da je bila deklaracija, ki prejme iterator, deklarirana. Iterator je v povratnem izrazu razporejen za pridobitev vrednosti na enak način, kot je razporejen kazalec.
begin () const noexcept;
Vrne iterator, ki kaže na prvi element vektorja. Kadar je pred vektorsko konstrukcijo const, se namesto „start () izvede izraz“ begin () const ”.”Pod tem pogojem ustreznega elementa v vektorju ni mogoče spremeniti. To se uporablja v naslednji kodi:
const vektorvektor
cout << *iter << '\n';
Izhod je 1.1. Upoštevajte, da je bil za prejem vrnjenega iteratorja tokrat uporabljen »const_iterator« namesto le »iterator«.
end () noexcept
Vrne iterator, ki kaže neposredno nad zadnji element vektorja. Upoštevajte naslednji segment kode:
vektorvektor
cout << *iter << '\n';
Izhod je 0, kar je nesmiselno, saj ni nobenega konkretnega elementa onkraj zadnjega elementa.
end () const noexcept
Vrne iterator, ki kaže neposredno nad zadnji element vektorja. Kadar je pred vektorsko konstrukcijo "const", se namesto "end () izvede izraz" end () const ".”Upoštevajte naslednji segment kode:
const vektorvektor
cout << *iter << '\n';
Izhod je 0. Upoštevajte, da je bil za prejem vrnjenega iteratorja tokrat uporabljen »const_iterator« namesto le »iterator«.
Povratna ponovitev
Možen je iterator, ki se ponovi od konca do tik pred prvim elementom.
rbegin () noexcept
Vrne iterator, ki kaže na zadnji element vektorja, kot v naslednjem segmentu kode:
vektorvektor
cout << *rIter << '\n';
Izhod je 4.4.
Upoštevajte, da je bila deklaracija, ki prejme povratni iterator, deklarirana. Iterator je v povratnem izrazu razporejen za pridobitev vrednosti na enak način, kot je razporejen kazalec.
rbegin () const noexcept;
Vrne iterator, ki kaže na zadnji element vektorja. Kadar je pred vektorsko konstrukcijo "const", se namesto "rbegin () izvede izraz" rbegin () const ".”Pod tem pogojem ustreznega elementa v vektorju ni mogoče spremeniti. Ta funkcija je uporabljena v naslednji kodi:
const vektorvektor
cout << *rIter << '\n';
Izhod je 4.4.
Upoštevajte, da je bil const_reverse_iterator tokrat namesto samo reverse_iterator uporabljen za prejemanje vrnjenega iteratorja.
rend () noexcept
Vrne iterator, ki kaže tik pred prvim elementom vektorja. Upoštevajte naslednji segment kode:
vektorvektor
cout << *rIter << '\n';
Rezultat je 0, kar je nesmiselno, saj tik pred prvim elementom ni konkretnega elementa.
rend () const noexcept
Vrne iterator, ki kaže tik pred prvim elementom vektorja. Kadar je pred vektorsko konstrukcijo "const", se namesto "rend () izvede izraz" rend () const ".”Upoštevajte naslednji segment kode:
const vektorvektor
cout << *rIter << '\n';
Izhod je 0.
Upoštevajte, da je bil const_reverse_iterator tokrat namesto samo reverse_iterator uporabljen za prejemanje vrnjenega iteratorja.
Vektorski modifikatorji
Modifikator, ki spreminja vektor, lahko sprejme ali vrne iterator.
a.emplace (p, args)
Vstavi objekt tipa T, zgrajen s std :: forward
vstavi (iteratorPosition, vrednost)
Vstavi kopijo vrednosti na mestu iteratorja vektorja. Vrne iterator (položaj) v vektorju, kamor je bila postavljena kopija. Naslednja koda prikazuje, kje je bila postavljena vrednost:
vektorvektor
++iter;
++iter;
vtr.vstavi (iter, 25);
cout << vtr[1] << " << vtr[2]<< '
" << vtr[3] << '\n';
Rezultat je: 20 25 30.
Upoštevajte, da je bil iterator napreden (povečan) tako kot kazalec.
Vstavite lahko tudi seznam inicializatorja, kot ponazarja naslednja koda:
vektorvektor
++iter;
++iter;
vtr.vstavi (iter, 25, 28);
cout << vtr[1] << " << vtr[2]<< '
" << vtr[3]<< " << vtr[4] << '\n';
Rezultat je: 20 25 28 30.
izbriši (položaj)
Odstrani element v položaju, na katerega kaže iterator, nato pa vrne položaj iteratorja. Naslednja koda to ponazarja:
vektorvektor
++iter;
++iter;
vtr.izbriši (iter);
cout << vtr[0] << " << vtr[1] << '
" << vtr[2]<< '\n';
Izhod je: 10 20 40
push_back (t), push_back (rv)
Uporablja se za dodajanje posameznega elementa na koncu vektorja. Uporabite push_back (t), kot sledi:
vektorvtr.push_back (5.5);
plovec fl = vtr [4];
cout << fl << '\n';
Izhod je 5.5.
push_back (rv): - glej kasneje.pop_back ()
Odstrani zadnji element, ne da bi ga vrnil. Velikost vektorja se zmanjša za 1. Naslednja koda to ponazarja:
vektorvtr.pop_back ();
plovec sz = vtr.velikost ();
cout << sz << '\n';
Izhod je 3.
a.zamenjava (b)
Dva vektorja je mogoče zamenjati, kot je prikazano v naslednjem segmentu kode:
vektorvektor
vtr1.zamenjaj (vtr2);
cout << "vtr1: "<< vtr1[0] <<" "<< vtr1[1] <<"
"<< vtr1[2] <<" "<< vtr1[3] << '\n';
cout << "vtr2: "<< vtr2[0] <<" "<< vtr2[1] <<"
"<< vtr2[2] <<" "<< vtr2[3] << '\n';
Rezultat je:
vtr1: 10 20 0 0vtr2: 1.1 2.2 3.3 4.4
Po potrebi se dolžina vektorja poveča. Vrednosti, ki niso imele zamenjav, se nadomestijo z neko privzeto vrednostjo.
jasno ()
Odstrani vse elemente iz vektorja, kot ponazarja naslednji segment kode:
vektorvtr.jasno ();
cout << vtr.size() << '\n';
Izhod je 0.
Operaterji enakosti in relacije za vektorje
Operater ==
Vrne 1 za true, če imata vektorja enako velikost in sta ustrezna elementa enaka; v nasprotnem primeru vrne 0 za false. Na primer:
vektorvektor
bool bl = U == V;
cout << bl << '\n';
Izhod je 0.
The != Operater
Vrne 1 za true, če vektorja nimata enake velikosti in / ali ustrezni elementi niso enaki; v nasprotnem primeru vrne 0 za false. Na primer:
vektorvektor
bool bl = U!= V;
cout << bl << '\n';
Izhod je 1.
The < Operator
Vrne 1 za true, če je prvi vektor začetna podskupina drugega vektorja, pri čemer so elementi obeh enakih delov enaki in v istem vrstnem redu. Če sta oba vektorja enake velikosti in se premikata od leve proti desni in v prvem vektorju naletimo na element, ki je manjši od ustreznega elementa v drugem vektorju, bo 1 še vedno vrnjen. V nasprotnem primeru se vrne 0 za false. Na primer:
vektorvektor
bool bl = U
Izhod je 1. < does not include the case when the size and order are the same.
> Operater
Vrne !(U < V), where U is the first vector and V is the second vector, according to the above definitions.
The <= Operator
Vrne U <= V, where U is the first vector and V is the second vector, according to the above definitions.
Operater> =
Vrne !(U <= V), where U is the first vector and V is the second vector, according to the above definitions.
Zaključek
Vektor je primer vsebnika zaporedja. Vektor je "boljša" oblika navadnega polja in se ustvari iz razreda. Vektorji imajo metode, ki so razvrščene pod: konstrukcija in dodelitev, zmogljivost, dostop do elementov, dostop do podatkov, iteratorji, modifikatorji in numerični preobremenjeni operaterji.
Obstajajo tudi drugi zabojniki zaporedja, imenovani seznam, posredovani_list in matrika. Če opravilo vključuje pogoste vstavitve in brisanja sredi zaporedja, je treba uporabiti seznam ali naprej_list. Če opravilo vključuje pogoste vstavitve in brisanja na začetku ali koncu zaporedja, potem uporabite deque. Torej, vektorje je treba uporabljati le, kadar tovrstne operacije niso pomembne.