vectors stl
Uloga vektora u STL-u s primjerima.
Do sada smo u ovoj C ++ seriji vidjeli statičke nizove koji imaju fiksnu veličinu.
Ako usred programa moramo spremiti više elemenata u polje, to postaje nemoguće i sigurno ćemo dobiti iznimku ‘out_of_bound’, onog trenutka kada pokušamo pohraniti elemente izvan granica polja.
Jedno od rješenja za to je deklariranje niza s maksimalnim kapacitetom, tako da nećemo pronaći nikakav problem u spremanju više elemenata tijekom izvođenja. Ali ovaj aranžman ima ozbiljan nedostatak u tome što gubimo previše memorije.
=> Ovdje pogledajte cjelovitu seriju C ++ treninga.
Odgovor na sva ova pitanja je upotreba dinamičkog niza koji će se sam širiti prema potrebi. STL pruža ovaj dinamički niz u obliku vektorskog spremnika.
Što ćete naučiti:
- Kako definiramo vektore?
- Deklariranje vektora u C ++ s std :: Vector Class
- Inicijalizirajte vektor
- Iterator vektora
- Vektorske funkcije
- Kapacitet vektora
- Vektorski modifikatori
- 2D vektor
- Primjer vektora
- Zaključak
- Preporučena literatura
Kako definiramo vektore?
Vektori su dinamički spremnici polja koji automatski mijenjaju veličinu kad se elementi umetnu ili izbrišu. Pohranom vektora upravlja sam spremnik vektora.
Elementi u vektoru pohranjeni su na susjednim mjestima. Baš poput nizova, i vektorskim elementima se može prelaziti i pristupiti pomoću iteratora.
Deklariranje vektora u C ++ s std :: Vector Class
U STL vektorskoj klasi ' std :: vektor ’Definirano je pod zaglavljem. Stoga, da bismo koristili vektorski spremnik, trebali bismo uključiti ovo zaglavlje u naš program kao što je prikazano dolje:
#include
Možemo proglasiti prazan vektor kao što je prikazano dolje:
std::vector myvec;
Gornji redak koda stvorit će vektor s elementima tipa integer. U sjećanje će ovo biti postavljeno kao myvec.
Inicijalizirajte vektor
Vektor možemo inicijalizirati vrijednošću u trenutku njegovog deklariranja.
kako čitati .bin datoteku
To se radi na sljedeći način:
#include int main() { std::vector myvec = {1, 1, 2, 3, 5}; }
U gornjem kodu deklariramo vektor tipa int nazvan myvec koji sadrži prvih pet elemenata u Fibonaccijevoj sekvenci.
Izgled memorije ovog vektora bit će sljedeći:
Iterator vektora
Kao što je već spomenuto, koristimo iteratore za sekvencijalno kretanje kroz vektor.
Vektori podržavaju sljedeće funkcije iteratora za prolazak kroz elemente:
- započeti () - Vraća iterator usmjeren na prvi element vektorskog spremnika.
- kraj() - Vraća iterator koji pokazuje na element koji slijedi posljednji element u vektoru.
- rbegin () - Vraća obrnuti iterator koji pokazuje na posljednji element u vektorskom spremniku.
- render () - Vraća obrnuti iterator koji pokazuje na prvi element vektorskog spremnika.
- cbegin () - Vraća konstantni iterator koji pokazuje na prvi element u vektorskom spremniku.
- nekoliko() - Vraća konstantni iterator koji pokazuje na element koji slijedi posljednji element vektorskog spremnika.
- crbegin () - Vraća obrnuti iterator konstante koji pokazuje na posljednji element u vektorskom spremniku.
- crend () - Vraća obrnuti konstantni iterator koji pokazuje na prvi element u vektorskom spremniku.
Pogledajmo primjer koji bi pokazao ove funkcije iteratora.Ostale funkcije mogu se koristiti slično.
#include #include using namespace std; int main() { vector v1; for (int i = 1; i <= 5; i++) v1.push_back(i+1); cout << 'Output of Vector with begin and end: '; for (auto i = v1.begin(); i != v1.end(); ++i) cout << *i << ' '; cout << '
Output of Vector with rbegin and rend: '; for (auto itr = v1.rbegin(); itr != v1.rend(); ++itr) cout << *itr << ' '; cout << '
Output Vector of with cbegin and cend: '; for (auto itc = v1.cbegin(); itc != v1.cend(); ++itc) cout << *itc << ' '; cout << '
Output Vector of with crbegin and crend : '; for (auto icr = v1.crbegin(); icr != v1.crend(); ++icr) cout << *icr << ' '; return 0; }
Izlaz:
Izlaz vektora s početkom i krajem: 2 3 4 5 6
Izlaz vektora s rbeginom i rendom: 6 5 4 3 2
Izlazni vektor za cbegin i cend: 2 3 4 5 6
Izlazni vektor s crbegin i crend: 6 5 4 3 2
Tako u ovom kodu deklariramo vektor i u njega ubacujemo vrijednosti pomoću funkcije push_back. Zatim prikazujemo vektore koristeći svaku od funkcija iteratora koje smo gore opisali. Kao što vidite iz rezultata, ovisno o korištenim funkcijama iteratora, redoslijed prikazivanja vektora se mijenja.
Vektorske funkcije
Sortiranje vektora
Možemo se koristiti STL algoritmima koje smo već vidjeli na vektoru.
Dolje je dat primjer korištenja 'Sort' na vektoru.
#include #include #include using namespace std; int main() { vector myvec = {10,50,30,20,60,40}; cout<<'Original Vector'< Izlaz:
Izvorni vektor
10 50 30 20 60 40
Poredani vektor
10 20 30 40 50 60
U gornjem primjeru inicijalizirali smo vektor, a zatim primijenili algoritam sortiranja za sortiranje vektora.
Ispis elemenata vektora
Vektori se mogu ispisati pomoću iteratora i 'cout' struje. Pomoću iteratora možemo proći kroz svaki od vektorskih elemenata i ispisati ih coutom.
Sljedeći primjer to pokazuje:
#include #include using namespace std; int main() { vector v1; for (int i = 1; i <= 5; i++) v1.push_back(i+2); cout << 'Output of Vector with begin and end: '; for (auto i = v1.begin(); i != v1.end(); ++i) cout << *i << ' '; }
Izlaz:
Izlaz vektora s početkom i krajem: 3 4 5 6 7
Kapacitet vektora
Postoje razne funkcije koje djeluju na vektore kako bi odredile njegovu veličinu, maksimalnu veličinu itd.
Funkcije navodimo kao dolje:
(i) Veličina vektora
Veličina funkcije () vraća broj elemenata u vektorskom spremniku. Ovo je ugrađena funkcija klase std :: vector i može se koristiti izravno za pronalaženje veličine vektora.
mrežni sigurnosni softver za pružatelje usluga
Pogledajmo Primjer vektora pomoću funkcije size ():
#include #include using namespace std; int main() { vector myvec = {1, 1, 2, 3, 5, 8}; cout << 'Vector Size : ' << myvec.size(); return 0; }
Izlaz:
Veličina vektora: 6
U gornjem programu definirali smo vektor myvec koji se sastoji od šest elemenata. Zatim pozivamo funkciju size () na myvec i prikazuje ispravnu veličinu.
(ii) Promjena veličine vektora
Vektoru također možemo promijeniti veličinu na željenu veličinu tako da može sadržavati 'n' broj elemenata. To se postiže funkcijom 'resize ()' klase std :: vector. Funkcija promjene veličine uzima veličinu vektora kao parametar, a zatim veličinu spremnika vektora podešava na navedenu veličinu.
Shvatimo to uz pomoć primjera.
#include #include using namespace std; int main() { vector myvec = {1, 1, 2, 3, 5, 8}; cout << '
Vector elements are: '; for (auto it = myvec.begin(); it != myvec.end(); it++) cout << *it << ' '; myvec.resize(4); cout << '
Vector Size after resize: ' << myvec.size(); cout << '
Vector elements after resizing are: '; for (auto it = myvec.begin(); it != myvec.end(); it++) cout << *it << ' '; return 0; }
Izlaz:
Elementi vektora su: 1 1 2 3 5 8
Veličina vektora nakon promjene veličine: 4
Elementi vektora nakon promjene veličine su: 1 1 2 3
U gornjem programu u početku definiramo vektor myvec veličine 6. Tada pozivamo funkciju promjene veličine na ovom vektoru veličine = 4. To znači da sada želimo promijeniti svoj vektor na veličinu 4.
Nakon poziva funkcije promjene veličine ponovno ispisujemo vektor. Vidimo da kada veličinu vektora postavimo na veličinu 4, preostali se elementi odbacuju i prikazuju se samo 4 elementa vektora.
Osim funkcija veličine i promjene veličine, vektorska klasa podržava i još neke funkcije koje nam omogućuju manipulaciju kapacitetom vektora. Oni su:
- max_size (): Vraća maksimalnu veličinu, tj. Maksimalni broj elemenata koje vektor može sadržavati.
- kapacitet(): Vraća veličinu trenutno dodijeljenog prostora za pohranu. To se vraća u smislu broja elemenata.
- prazan(): Provjerava je li spremnik prazan.
- smanjiti da stane(): Smanjuje vektorski kapacitet kako bi odgovarao veličini i odbacuje sve ostale elemente.
- pričuva (): Rezervira vektorski kapacitet da sadrži n elemenata.
Vektorski modifikatori
Modifikatori su operacije ili funkcije koje se mogu koristiti za izmjenu sadržaja vektorskog spremnika. Vidjet ćemo neke od glavnih funkcija koje se koriste kao modifikatori.
Dodjeljivanje novih vrijednosti vektoru
Jedna od funkcija modifikatora koju pruža std :: vector je funkcija dodjeljivanja. Funkcija Dodijeli vektoru dodjeljuje nove vrijednosti zamjenom starih.
To je prikazano u sljedećem primjeru.
#include #include using namespace std; int main() { // Assign vector vector myvec; // assign value 10 5 times myvec.assign(5, 10); cout << 'The vector elements: '; for (int i = 0; i < myvec.size(); i++) cout << myvec[i] << ' '; }
Izlaz:
Elementi vektora: 10 10 10 10 10
U gornjem kodu deklariramo vektor tipa int. Zatim pozivamo da dodijelimo funkciju s parametrima 5, 10. To znači da element 10 namjeravamo dodijeliti vektoru 5 puta. Kada prikažemo vektor, vidimo da vektor ima 5 elemenata, svi s vrijednošću 5.
Brisanje vektora
Sljedeća funkcija koju std :: vector pruža za izmjenu vektora je funkcija 'brisanje'. Funkcija brisanja uklanja elemente iz navedenog raspona ili položaja iz vektora.
Pogledajmo primjer funkcije brisanja.
#include #include using namespace std; int main() { // Initialize vector vector myvec = {1,1,2,3,5}; cout << '
Vector elements:'; for (int i = 0; i < myvec.size(); i++) cout << myvec[i] << ' '; // remove the first element myvec.erase(myvec.begin()); cout<<'
Vector size after erase: '< Izlaz:
Elementi vektora: 1 1 2 3 5
Veličina vektora nakon brisanja: 4
Vektor nakon operacije brisanja: 1 2 3 5
Kao što je prikazano u gornjem izlazu za funkciju promjene veličine, mi određujemo opseg ili položaj elementa koji se želi izbrisati ili ukloniti. U gornjem primjeru odredili smo položaj koji pokazuje na prvi element u vektoru.
Umetanje elemenata u vektor
Vektorska klasa std :: vector pruža još jednu funkciju za umetanje vrijednosti u vektor. Funkcija Umetanje omogućuje nam umetanje elemenata u vektor prije navedenog položaja.
To će biti jasno sa sljedećim Primjerom.
#include #include using namespace std; int main() { // Assign vector vector myvec = {2,3,4}; cout << '
Initial vector: '; for (int i = 0; i < myvec.size(); i++) cout << myvec[i] << ' '; // inserts 20 at the beginning, 30 after that myvec.insert(myvec.begin(), 20); myvec.insert(myvec.begin()+1,30); cout << '
New vector after insert: '; for (int i = 0; i < myvec.size(); i++) cout << myvec[i] << ' '; }
Izlaz:
Početni vektor: 2 3 4
Novi vektor nakon umetanja: 20 30 2 3 4
Gornji program u početku deklarira vektor s 3 elementa. Zatim dvaput pozivamo funkciju umetanja da bismo umetnuli vrijednosti 20 i 30 na prvo i drugo mjesto u vektor. Zatim prikazujemo promijenjeni vektor.
Zamjena vektorskog sadržaja
Klasa vektora također nam pruža mogućnost zamjene ili razmjene sadržaja jednog vektora sa sadržajem drugog vektora iste vrste i veličine. To se postiže vektorski ugrađenom funkcijom 'swap'.
Razmotrite sljedeći dio koda.
#include #include using namespace std; int main() { // swap operation vector v1, v2; v1.push_back(1); v1.push_back(3); v2.push_back(5); v2.push_back(7); cout << '
Vector 1: '; for (int i = 0; i < v1.size(); i++) cout << v1[i] << ' '; cout << '
Vector 2: '; for (int i = 0; i < v2.size(); i++) cout << v2[i] << ' '; // Swaps v1 and v2 v1.swap(v2); cout << '
After Swap
Vector 1: '; for (int i = 0; i < v1.size(); i++) cout << v1[i] << ' '; cout << '
Vector 2: '; for (int i = 0; i < v2.size(); i++) cout << v2[i] << ' '; }
Izlaz:
Vektor 1: 1 3
Vektor 2: 5 7
Nakon zamjene
Vektor 1: 5 7
Vektor 2: 1 3
Gornji kod prikazuje sadržaj dvaju vektora prije i nakon zamjene.
Čišćenje vrijednosti u vektoru
Za razliku od uklanjanja jednog ili više elemenata iz vektora upotrebom funkcije brisanja, imamo još jednu funkciju 'Clear' koja nam omogućuje uklanjanje svih elemenata u spremniku vektora.
U donjem programu prikazujemo jasnu funkciju vektorskog spremnika.
#include #include using namespace std; int main() { // swap operation vector v1; v1.push_back(1); v1.push_back(3); v1.push_back(5); v1.push_back(7); cout<<'
Size of vector v1: '< Izlaz:
Veličina vektora v1: 4
Vektor 1: 1 3 5 7
Veličina vektora v1 nakon poziva za brisanje funkcije: 0
Ovdje prvo deklariramo vektor, a zatim u njega guramo elemente. Jednom kada funkciju pozovemo clear (), vidimo da se svi elementi u vektoru odjednom uklanjaju.
u (poz)
Ova funkcija vraća referencu na element na položaju 'pos' unutar vektora.
Ovo je jedna od funkcija koja se koristi za pristup vektorskom elementu.
Primjer je dan u nastavku:
#include #include using namespace std; int main() { // Assign vector vector myvec = {1,1,2,3,5,8}; cout<<'
Element at position 3 : '< Izlaz:
Element na položaju 3: 3
Kao što je prikazano u primjeru, funkcija 'at' koristi se za pristup elementu u vektoru na navedenom položaju.
Ispred
Funkcija 'front' vraća referencu na prvi element vektora. Ovo je još jedna funkcija koju koristimo za pristup elementima vektorskog spremnika.
kako stvoriti novi popis u javi -
Sljedeći primjer pokazuje upotrebu funkcije 'front'.
#include #include #include using namespace std; int main() { // Initialize vector vector myvec = {1,1,2,3,5,8}; cout<<'
Input vector: '; for(auto it=myvec.begin();it Izlaz:
Ulazni vektor: 1 1 2 3 5 8
Element na prednjoj strani vektora: 1
leđa
Slično funkciji ‘front’, funkcija back koristi se za pristup posljednjem elementu vektorskog spremnika. Funkcija ‘povratak’ vraća referencu na posljednji element u vektorskom spremniku.
Sljedeći primjer prikazuje upotrebu funkcije 'povratak'.
#include #include #include using namespace std; int main() { // Initialize vector vector myvec = {1,1,2,3,5,8}; cout<<'
Input vector: '; for(auto it=myvec.begin();it Izlaz:
Ulazni vektor: 1 1 2 3 5 8
Element na stražnjoj strani vektora: 8
Pronađi element u vektoru
Funkcija 'pronađi' koristi se za pronalaženje je li određeni element (koji se naziva ključ) prisutan u vektoru ili ne. Ova bi funkcija trebala biti brza i učinkovita. Jednom kad se vrijednost pronađe, funkcija se vraća.
Sljedeći primjer prikazuje upotrebu funkcije pronalaženja.
#include #include #include using namespace std; int main() { // Assign vector vector myvec = {1,1,2,3,5,8}; cout<<'
Input vector: '; for(auto it=myvec.begin();itkey; if(find(myvec.begin(),myvec.end(),key)!= myvec.end()) cout<<'
Element found'; else cout<<'
Element not found'; }
Izlaz:
Ulazni vektor: 1 1 2 3 5 8
Unesite ključ za pretragu: 0
Element nije pronađen
2D vektor
Dvodimenzionalni vektor poznat je i pod nazivom 'Vektor vektora'. Poput dvodimenzionalnih nizova, elementi dvodimenzionalnih vektora također su poredani u matričnom obliku.
Primjer programa za 2D vektor dat je u nastavku.
#include #include // for 2D vector using namespace std; int main() { // Initializing 2D vector 'odd_vect' with vector odd_vect{ { 1, 3, 5 }, { 7, 9, 11 }, { 13,15,17 } }; // Displaying the 2D vector cout<<'2D vector : '; cout< Izlaz:
2D vektor:
1 3 5
7 9 11
13 15 17
U gornjem primjeru, imajte na umu način na koji je definiran 2D vektor. Definiran je kao vektor unutar drugog vektora. Prikazujući ovaj 2D vektor, koristimo isti pristup kao i prikaz 2D nizova.
Primjer vektora
Dolje je dan primjer vektora koji sadrži većinu vektorskih operacija.
#include #include using namespace std; int main() { // Assign vector vector myvec; // assign value 10 5 times myvec.assign(5, 10); cout << 'The vector elements: '; for (int i = 0; i < myvec.size(); i++) cout << myvec[i] << ' '; // push value 5 in myvec myvec.push_back(5); int n = myvec.size(); cout << '
The new vector after push_back:'; for (int i = 0; i < myvec.size(); i++) cout << myvec[i] << ' '; // pop the element myvec.pop_back(); cout<<'
New vector after pop_back : '; for (int i = 0; i < myvec.size(); i++) cout << myvec[i] << ' '; // inserts 20 at the beginning myvec.insert(myvec.begin(), 20); cout << '
New vector after insert: '; for (int i = 0; i < myvec.size(); i++) cout << myvec[i] << ' '; // remove the first element myvec.erase(myvec.begin()); cout<<'
Vector size after erase: '< Izlaz:
Elementi vektora: 10 10 10 10 10
Novi vektor nakon push_back: 10 10 10 10 10 5
Novi vektor nakon pop_back: 10 10 10 10 10
Novi vektor nakon umetka: 20 10 10 10 10 10
Veličina vektora nakon brisanja: 5
Nakon brisanja prvog elementa: 10 10 10 10 10
Slijedi snimak zaslona za isti.
U gornjem primjeru deklariramo vektor, a zatim pomoću funkcija assign i push_back unosimo elemente u vektor. Zatim koristimo funkciju pop_back za uklanjanje elementa s kraja vektora. Nakon toga, opet dodajemo jedan element u vektor pomoću umetnutog elementa, a zatim brišemo element pomoću funkcije brisanja.
Ovo je primjer s kraja na kraj vektorskog spremnika koji pokazuje svoje različite funkcije.
Zaključak
Ovim smo došli do kraja ovog vodiča o vektoru.
U našem nadolazećem uputstvu naučit ćemo o spremniku 'popisa' STL-a koji je sličan linijama nizova i vektora.
=> Ovdje pogledajte Savršeni vodič za obuku za C ++.
Preporučena literatura