vectors stl
Úloha vektorov v STK s príkladmi.
Zatiaľ sme v tejto sérii C ++ videli statické polia, ktoré majú pevnú veľkosť.
Ak v strede programu musíme do poľa uložiť viac prvkov, stane sa to nemožným a určite dostaneme výnimku „out_of_bound“ v okamihu, keď sa pokúsime uložiť prvky za limity poľa.
Jedným z riešení je deklarovanie poľa s maximálnou kapacitou, takže nenájdeme problém s ukladaním ďalších prvkov za behu. Ale toto usporiadanie má vážnu nevýhodu v tom, že teda strácame príliš veľa pamäte.
=> Kompletnú sériu školení v C ++ nájdete tu.
Odpoveďou na všetky tieto problémy je použitie dynamického poľa, ktoré sa bude rozširovať podľa potreby. STL poskytuje toto dynamické pole vo forme vektorového kontajnera.
Čo sa dozviete:
- Ako definujeme vektory?
- Deklarovanie vektora v C ++ s triedou std :: Vector
- Inicializovať vektor
- Vektorový iterátor
- Vektorové funkcie
- Vektorová kapacita
- Vektorové modifikátory
- 2D vektor
- Vektorový príklad
- Záver
- Odporúčané čítanie
Ako definujeme vektory?
Vektory sú kontajnery dynamického poľa, ktoré automaticky menia veľkosť po vložení alebo odstránení prvkov. Uloženie vektora je riešené samotným vektorovým kontajnerom.
Prvky vo vektore sú uložené na susedných miestach. Rovnako ako polia, aj vektorové prvky možno prechádzať a pristupovať k nim pomocou iterátorov.
Deklarovanie vektora v C ++ s triedou std :: Vector
Vo vektorovej triede STL ‘ std :: vektor ‘Je definované pod hlavičkou. Aby sme teda mohli použiť vektorový kontajner, mali by sme túto hlavičku zahrnúť do nášho programu, ako je uvedené nižšie:
#include
Ako je uvedené nižšie, môžeme deklarovať prázdny vektor:
std::vector myvec;
Vyššie uvedený riadok kódu vytvorí vektor s prvkami typu integer. Na pamiatku to bude stanovené ako myvec.
Inicializovať vektor
Vektor môžeme inicializovať s hodnotou v čase jeho vyhlásenia.
implementácia binárneho stromu c ++
Toto sa deje nasledovne:
#include int main() { std::vector myvec = {1, 1, 2, 3, 5}; }
Vo vyššie uvedenom kóde deklarujeme vektor typu int s názvom myvec obsahujúci prvých päť prvkov vo Fibonacciho sekvencii.
Rozloženie pamäte tohto vektora bude uvedené nižšie:
Vektorový iterátor
Ako už bolo spomenuté, pomocou iterátorov prechádzame vektorom postupne.
Vektory na prechádzanie prvkami podporujú nasledujúce funkcie iterátora:
- začať() - Vráti iterátor nasmerovaný na prvý prvok vektorového kontajnera.
- koniec() - Vráti iterátor smerujúci na prvok, ktorý nasleduje za posledným prvkom vo vektore.
- rbegin () - Vráti spätný iterátor ukazujúci na posledný prvok vo vektorovom kontajneri.
- render () - Vráti spätný iterátor ukazujúci na prvý prvok vektorového kontajnera.
- cbegin () - Vráti konštantný iterátor ukazujúci na prvý prvok vo vektorovom kontajneri.
- zopár() - Vráti konštantný iterátor ukazujúci na prvok nasledujúci za posledným prvkom vektorového kontajnera.
- crbegin () - Vráti iterátor reverznej konštanty smerujúci na posledný prvok vo vektorovom kontajneri.
- crend () - Vráti iterátor reverznej konštanty smerujúci na prvý prvok vo vektorovom kontajneri.
Pozrime sa na príklad, ktorý by demonštroval tieto funkcie iterátora.Ostatné funkcie možno použiť podobne.
#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; }
Výkon:
Výstup Vektora so začiatkom a koncom: 2 3 4 5 6
Výstup Vector s rbegin a rend: 6 5 4 3 2
Vektor výstupu s cbegin a cend: 2 3 4 5 6
Výstupný vektor s crbegin a crend: 6 5 4 3 2
V tomto kóde teda deklarujeme vektor a vkladáme do neho hodnoty pomocou funkcie push_back. Potom zobrazíme vektory pomocou každej z funkcií iterátora, ktoré sme opísali vyššie. Ako vidíte na výstupe, v závislosti od použitých funkcií iterátora sa mení poradie, v ktorom sa vektor zobrazuje.
Vektorové funkcie
Triedenie vektora
Môžeme použiť STL algoritmy, ktoré sme už videli na vektore.
Ďalej uvádzame príklad použitia vektora „Zoradiť“.
#include #include #include using namespace std; int main() { vector myvec = {10,50,30,20,60,40}; cout<<'Original Vector'< Výkon:
Pôvodný vektor
10 50 30 20 60 40
Zoradený vektor
10 20 30 40 50 60
Vo vyššie uvedenom príklade sme inicializovali vektor a potom sme na jeho zoradenie použili algoritmus triedenia.
Tlač Prvky Vektora
Vektory môžu byť tlačené pomocou iterátora a prúdu „cout“. Môžeme použiť iterátor na prechod cez každý z vektorových prvkov a ich vytlačenie coutom.
Ukazuje to nasledujúci príklad:
#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 << ' '; }
Výkon:
Výstup Vektora so začiatkom a koncom: 3 4 5 6 7
Vektorová kapacita
Existuje niekoľko funkcií, ktoré pôsobia na vektory na určenie jeho veľkosti, maximálnej veľkosti atď.
Zoznam funkcií uvádzame nižšie:
i) Veľkosť vektora
Funkcia size () vracia počet prvkov vo vektorovom kontajneri. Toto je zabudovaná funkcia triedy std :: vector a dá sa priamo použiť na zistenie veľkosti vektora.
online zálohovací softvér pre poskytovateľov služieb
Pozrime sa na príklad vektora pomocou funkcie size ():
#include #include using namespace std; int main() { vector myvec = {1, 1, 2, 3, 5, 8}; cout << 'Vector Size : ' << myvec.size(); return 0; }
Výkon:
Veľkosť vektora: 6
Vo vyššie uvedenom programe sme definovali vektorový myvec pozostávajúci zo šiestich prvkov. Ďalej zavoláme funkciu size () na myvec a tá zobrazí správnu veľkosť.
(ii) Zmena veľkosti vektora
Môžeme tiež zmeniť veľkosť vektora na požadovanú veľkosť tak, aby pojal „n“ počet prvkov. To sa dosiahne funkciou „resize ()“ triedy std :: vector. Funkcia zmeny veľkosti vezme ako parameter veľkosť vektora a potom zmení veľkosť vektorového kontajnera na zadanú veľkosť.
Pochopme to pomocou príkladu.
#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; }
Výkon:
Vektorové prvky sú: 1 1 2 3 5 8
Veľkosť vektora po zmene veľkosti: 4
Vektorové prvky po zmene veľkosti sú: 1 1 2 3
Vo vyššie uvedenom programe pôvodne definujeme vektorový myvec veľkosti 6. Potom na tomto vektore zavoláme funkciu zmeny veľkosti s veľkosťou = 4. To znamená, že teraz chceme zmeniť veľkosť nášho vektora na veľkosť 4.
Po vyvolaní funkcie zmeny veľkosti vektor opäť vytlačíme. Vidíme, že keď zmeníme veľkosť vektora na veľkosť 4, zvyšné prvky sa zahodia a zobrazia sa iba 4 prvky vektora.
Okrem funkcií na zmenu veľkosti a zmenu veľkosti podporuje vektorová trieda aj niektoré ďalšie funkcie, ktoré nám umožňujú manipulovať s kapacitou vektora. Oni sú:
- max_size (): Vráti maximálnu veľkosť, t. J. Maximálny počet prvkov, ktoré môže vektor obsahovať.
- kapacita (): Vráti aktuálne pridelenú veľkosť úložného priestoru. Toto sa vracia z hľadiska počtu prvkov.
- prázdne (): Skontroluje, či je kontajner prázdny.
- zmenšiť, aby sa zmestili(): Zmenší vektorovú kapacitu tak, aby zodpovedala veľkosti, a zahodí všetky ostatné prvky.
- rezerva (): Rezervuje vektorovú kapacitu tak, aby obsahovala n prvkov.
Vektorové modifikátory
Modifikátory sú operácie alebo funkcie, ktoré možno použiť na úpravu obsahu vektorového kontajnera. Uvidíme niektoré z hlavných funkcií, ktoré sa používajú ako modifikátory.
Priradenie nových hodnôt vektoru
Jednou z funkcií modifikátorov poskytovaných std :: vector je funkcia assign. Funkcia Assign priraďuje nové hodnoty vektoru nahradením starých.
To je demonštrované v nasledujúcom príklade.
#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) << ' '; }
Výkon:
Vektorové prvky: 10 10 10 10 10
Vo vyššie uvedenom kóde deklarujeme vektor typu int. Potom zavoláme na priradenie funkcie s parametrami 5, 10. To znamená, že chceme prvku 10 priradiť vektor 5 krát. Keď zobrazíme vektor, zistíme, že vektor má 5 prvkov, všetky s hodnotou 5.
Vymazanie vektora
Ďalšou funkciou poskytovanou programom std :: vector na úpravu vektora je funkcia „vymazať“. Funkcia Vymazať odstráni prvky zo zadaného rozsahu alebo polohy z vektora.
Pozrime sa na príklad funkcie Vymazať.
#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: '< Výkon:
Vektorové prvky: 1 1 2 3 5
Veľkosť vektora po vymazaní: 4
Vektor po operácii vymazania: 1 2 3 5
Ako je uvedené v predchádzajúcom výstupe pre funkciu zmeny veľkosti, určujeme rozsah alebo polohu prvku, ktorý sa má vymazať alebo odstrániť. Vo vyššie uvedenom príklade sme určili pozíciu ukazujúcu na prvý prvok vo vektore.
Vložte prvky do vektora
Vektorová trieda std :: vector poskytuje ešte ďalšiu funkciu na vkladanie hodnôt do vektora. Funkcia Vložiť nám umožňuje vložiť prvky do vektora pred zadanou pozíciou.
To bude zrejmé z nasledujúceho príkladu.
#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) << ' '; }
Výkon:
Počiatočný vektor: 2 3 4
Nový vektor po vložení: 20 30 2 3 4
Vyššie uvedený program deklaruje na začiatku vektor s 3 prvkami. Potom dvakrát zavoláme funkciu vloženia, aby sme vložili hodnoty 20 a 30 na prvú a druhú pozíciu do vektora. Potom zobrazíme zmenený vektor.
Zamieňanie vektorového obsahu
Trieda vektorov nám tiež poskytuje schopnosť zamieňať alebo vymieňať obsah jedného vektora s obsahom iného vektora rovnakého typu a veľkosti. To sa dosiahne vektorovou vstavanou funkciou „swap“.
Zvážte nasledujúcu časť kódu.
#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) << ' '; }
Výkon:
Vektor 1: 1 3
Vektor 2: 5 7
Po výmene
Vektor 1: 5 7
Vektor 2: 1 3
Vyššie uvedený kód zobrazuje obsah dvoch vektorov pred a po výmene.
Čistenie hodnôt vo vektore
Na rozdiel od odstránenia jedného alebo viacerých prvkov z vektora pomocou funkcie mazania máme ďalšiu funkciu „Vymazať“, ktorá nám umožňuje odstrániť všetky prvky vo vektorovom kontajneri.
V nasledujúcom programe demonštrujeme jasnú funkciu vektorového kontajnera.
#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: '< Výkon:
Veľkosť vektora v1: 4
Vektor 1: 1 3 5 7
Veľkosť vektora v1 po vyvolaní funkcie clear: 0
Tu najskôr deklarujeme vektor a potom do neho vtlačíme prvky. Akonáhle funkciu nazveme clear (), vidíme, že všetky prvky vo vektore sú odstránené naraz.
o (poz)
Táto funkcia vráti odkaz na prvok v polohe „pos“ vo vektore.
Toto je jedna z funkcií, ktorá sa používa na prístup k vektorovému prvku.
Nižšie je uvedený príklad:
#include #include using namespace std; int main() { // Assign vector vector myvec = {1,1,2,3,5,8}; cout<<'
Element at position 3 : '< Výkon:
Prvok na pozícii 3: 3
Ako je uvedené v príklade, funkcia „at“ sa používa na prístup k prvku vo vektore v určenej polohe.
Predné
Funkcia ‘predné’ vráti odkaz na prvý prvok vektora. Toto je ešte ďalšia funkcia, ktorú používame na prístup k prvkom vektorového kontajnera.
Nasledujúci príklad ukazuje použitie funkcie „predné“.
#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 Výkon:
Vstupný vektor: 1 1 2 3 5 8
Prvok v prednej časti vektora: 1
späť
Podobne ako funkcia ‘predné’, slúži funkcia zadné na prístup k poslednému prvku vektorového kontajnera. Funkcia „späť“ vráti odkaz na posledný prvok vo vektorovom kontajneri.
Nasledujúci príklad ukazuje použitie funkcie „späť“.
#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 Výkon:
Vstupný vektor: 1 1 2 3 5 8
Prvok v zadnej časti vektora: 8
Nájdite prvok vo vektore
Funkcia „nájsť“ sa používa na zistenie, či je určitý prvok (označovaný ako kľúč) vo vektore prítomný alebo nie. Táto funkcia má byť rýchla a efektívna. Akonáhle je hodnota nájdená, funkcia sa vráti.
Nasledujúci príklad ukazuje použitie funkcie find.
#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'; }
Výkon:
čo je súbor .swf?
Vstupný vektor: 1 1 2 3 5 8
Zadajte kľúč, ktorý chcete vyhľadať: 0
Prvok sa nenašiel
2D vektor
Dvojrozmerný vektor je tiež známy ako „Vektor vektora“. Rovnako ako dvojrozmerné polia, aj prvky dvojrozmerných vektorov sú usporiadané do maticového tvaru.
Nižšie je uvedený príklad programu pre vektor 2D.
#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< Výkon:
2D vektor:
1 3 5
7 9 11
13 15 17
Vo vyššie uvedenom príklade si všimnite, ako je definovaný 2D vektor. Je definovaný ako vektor vo vnútri iného vektora. Pri zobrazovaní tohto 2D vektora používame rovnaký prístup ako pri zobrazovaní 2D polí.
Vektorový príklad
Ďalej je uvedený príklad vektora, ktorý obsahuje väčšinu vektorových operácií.
#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: '< Výkon:
Vektorové prvky: 10 10 10 10 10
Nový vektor po push_back: 10 10 10 10 10 5
Nový vektor po pop_back: 10 10 10 10 10
Nový vektor po vložení: 20 10 10 10 10 10
Veľkosť vektora po vymazaní: 5
Po vymazaní prvého prvku: 10 10 10 10 10
Nasleduje nasledujúca snímka obrazovky.

Vo vyššie uvedenom príklade deklarujeme vektor a potom pomocou funkcií assign a push_back zadáme prvky do vektora. Potom použijeme funkciu pop_back na odstránenie prvku z konca vektora. Potom do vektora opäť pridáme jeden prvok pomocou vloženého prvku a potom prvok vymažeme pomocou funkcie mazania.
Toto je úplný príklad vektorového kontajnera demonštrujúceho jeho rôzne funkcie.
Záver
Týmto sme sa dostali na koniec tohto tutoriálu o vektoroch.
V našom pripravovanom výučbe sa dozvieme viac o kontajneri „list“ STL, ktorý je podobný riadkom polí a vektorov.
=> Vyskúšajte tu dokonalého školiaceho sprievodcu jazykom C ++.
Odporúčané čítanie