vectors stl
Role vektorů v STL s příklady.
Zatím jsme v této sérii C ++ viděli statická pole, která mají pevnou velikost.
Pokud ve středu programu musíme do pole uložit více prvků, pak je to nemožné a jsme si jisti, že dostaneme výjimku „out_of_bound“ v okamžiku, kdy se pokusíme uložit prvky nad limity pole.
Jedním z řešení je deklarovat pole s maximální kapacitou, takže nenajdeme žádný problém při ukládání více prvků za běhu. Ale toto uspořádání má vážnou nevýhodu v tom, že ztrácíme příliš mnoho paměti.
=> Podívejte se na kompletní sérii školení C ++ zde.
Odpověď na všechny tyto problémy spočívá v použití dynamického pole, které se podle potřeby samo rozšíří. STL poskytuje toto dynamické pole ve formě vektorového kontejneru.
Co se naučíte:
- Jak definujeme vektory?
- Deklarace vektoru v C ++ pomocí třídy std :: Vector
- Inicializovat vektor
- Vektorový iterátor
- Vektorové funkce
- Vektorová kapacita
- Vektorové modifikátory
- 2D vektor
- Příklad vektoru
- Závěr
- Doporučené čtení
Jak definujeme vektory?
Vektory jsou kontejnery dynamického pole, které automaticky mění velikost při vkládání nebo mazání prvků. Uložení vektoru je zpracováno samotným vektorovým kontejnerem.
Prvky ve vektoru jsou uloženy na sousedících místech. Stejně jako pole lze vektorové prvky procházet a přistupovat k nim pomocí iterátorů.
Deklarace vektoru v C ++ pomocí třídy std :: Vector
Ve STL vektorové třídě ‘ std :: vektor „Je definováno v záhlaví. Abychom tedy mohli použít vektorový kontejner, měli bychom tuto hlavičku zahrnout do našeho programu, jak je znázorněno níže:
#include
Můžeme deklarovat prázdný vektor, jak je znázorněno níže:
std::vector myvec;
Výše uvedený řádek kódu vytvoří vektor s prvky typu integer. Na památku to bude vyloženo jako myvec.
Inicializovat vektor
Můžeme inicializovat vektor s hodnotou v době jeho deklarace.
nástroje pro testování záznamu a přehrávání zdarma
To se děje následovně:
#include int main() { std::vector myvec = {1, 1, 2, 3, 5}; }
Ve výše uvedeném kódu deklarujeme vektor typu int s názvem myvec obsahující prvních pět prvků ve Fibonacciho sekvenci.
Rozložení paměti tohoto vektoru bude následující:
Vektorový iterátor
Jak již bylo zmíněno, používáme iterátory k postupnému procházení vektorem.
Vektory podporují následující funkce iterátoru pro procházení prvky:
- začít () - Vrátí iterátor směřující k prvnímu prvku vektorového kontejneru.
- konec() - Vrátí iterátor ukazující na prvek, který následuje za posledním prvkem ve vektoru.
- rbegin () - Vrátí zpětný iterátor ukazující na poslední prvek ve vektorovém kontejneru.
- poskytnout () - Vrátí zpětný iterátor ukazující na první prvek vektorového kontejneru.
- cbegin () - Vrátí konstantní iterátor ukazující na první prvek ve vektorovém kontejneru.
- trochu() - Vrátí konstantní iterátor ukazující na prvek následující za posledním prvkem vektorového kontejneru.
- crbegin () - Vrátí iterátor reverzní konstanty ukazující na poslední prvek ve vektorovém kontejneru.
- crend () - Vrátí iterátor reverzní konstanty ukazující na první prvek ve vektorovém kontejneru.
Podívejme se na příklad, který by demonstroval tyto funkce iterátoru.Ostatní funkce lze použít obdobně.
#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ýstup:
Výstup Vektoru se začátkem a koncem: 2 3 4 5 6
Výstup Vector s rbegin a rend: 6 5 4 3 2
Výstupní vektor s pomocí cbegin a cend: 2 3 4 5 6
Výstupní vektor s crbegin a crend: 6 5 4 3 2
V tomto kódu tedy deklarujeme vektor a vložíme do něj hodnoty pomocí funkce push_back. Potom zobrazíme vektory pomocí každé z iteračních funkcí, které jsme popsali výše. Jak vidíte z výstupu v závislosti na použitých funkcích iterátoru, změní se pořadí, ve kterém je vektor zobrazen.
Vektorové funkce
Třídění vektoru
Můžeme použít STL algoritmy, které jsme již viděli na vektoru.
Níže je uveden příklad použití ‘Seřadit’ na vektoru.
#include #include #include using namespace std; int main() { vector myvec = {10,50,30,20,60,40}; cout<<'Original Vector'< Výstup:
Původní vektor
10 50 30 20 60 40
Seřazený vektor
10 20 30 40 50 60
Ve výše uvedeném příkladu jsme inicializovali vektor a poté jsme pro jeho třídění použili třídicí algoritmus.
Tisk prvků vektoru
Vektory lze tisknout pomocí iterátoru a proudu „cout“. Můžeme použít iterátor k procházení každého z vektorových prvků a jejich tisku coutem.
Následující příklad to ukazuje:
#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ýstup:
Výstup Vektoru se začátkem a koncem: 3 4 5 6 7
Vektorová kapacita
Existuje několik funkcí, které na vektorech určují jeho velikost, maximální velikost atd.
Níže uvádíme seznam funkcí:
(i) Velikost vektoru
Funkce size () vrací počet prvků ve vektorovém kontejneru. Toto je vestavěná funkce třídy std :: vector a lze ji použít přímo k vyhledání velikosti vektoru.
generátor náhodných čísel mezi 0 a 1
Podívejme se na příklad vektoru pomocí funkce size ():
#include #include using namespace std; int main() { vector myvec = {1, 1, 2, 3, 5, 8}; cout << 'Vector Size : ' << myvec.size(); return 0; }
Výstup:
Velikost vektoru: 6
Ve výše uvedeném programu jsme definovali vektorový myvec skládající se ze šesti prvků. Dále voláme funkci size () na myvec a zobrazuje správnou velikost.
(ii) Změna velikosti vektoru
Můžeme také změnit velikost vektoru na požadovanou velikost tak, aby pojal „n“ počet prvků. Toho je dosaženo funkcí „resize ()“ třídy std :: vector. Funkce resize vezme velikost vektoru jako parametr a poté změní velikost vektorového kontejneru na zadanou velikost.
Rozumíme tomu pomocí pří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ýstup:
Vektorové prvky jsou: 1 1 2 3 5 8
Velikost vektoru po změně velikosti: 4
Vektorové prvky po změně velikosti jsou: 1 1 2 3
Ve výše uvedeném programu zpočátku definujeme vektorový myvec o velikosti 6. Potom na tomto vektoru zavoláme funkci resize s size = 4. To znamená, že nyní chceme změnit velikost našeho vektoru na velikost 4.
Po vyvolání funkce změny velikosti znovu vytiskneme vektor. Vidíme, že když změníme velikost vektoru na velikost 4, zbývající prvky se zahodí a zobrazí se pouze 4 prvky vektoru.
Kromě funkcí velikosti a změny velikosti podporuje vektorová třída také některé další funkce, které nám umožňují manipulovat s kapacitou vektoru. Oni jsou:
- max_size (): Vrátí maximální velikost, tj. Maximální počet prvků, které může vektor obsahovat.
- kapacita(): Vrátí aktuálně přidělenou velikost úložného prostoru. To se vrací z hlediska počtu prvků.
- prázdný(): Zkontroluje, zda je kontejner prázdný.
- shrink_to_fit (): Zmenší vektorovou kapacitu tak, aby odpovídala velikosti, a zahodí všechny ostatní prvky.
- rezervovat(): Rezervuje kapacitu vektoru tak, aby obsahovala n prvků.
Vektorové modifikátory
Modifikátory jsou operace nebo funkce, které lze použít k úpravě obsahu vektorového kontejneru. Uvidíme některé z hlavních funkcí, které se používají jako modifikátory.
Přiřazení nových hodnot vektoru
Jednou z funkcí modifikátorů poskytovaných std :: vector je funkce přiřazení. Funkce Assign přiřadí nové hodnoty vektoru nahrazením starých.
To je ukázáno v následujícím příkladu.
#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ýstup:
Vektorové prvky: 10 10 10 10 10
Ve výše uvedeném kódu deklarujeme vektor typu int. Potom voláme k přiřazení funkce s parametry 5, 10. To znamená, že máme v úmyslu přiřadit prvek 10 vektoru 5krát. Když zobrazíme vektor, vidíme, že vektor má 5 prvků, všechny s hodnotou 5.
Vymazání vektoru
Další funkcí, kterou poskytuje std :: vector k úpravě vektoru, je funkce „vymazat“. Funkce Erase odstraní prvky ze zadaného rozsahu nebo polohy z vektoru.
Podívejme se na příklad funkce Vymazat.
#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ýstup:
Vektorové prvky: 1 1 2 3 5
Velikost vektoru po vymazání: 4
Vektor po vymazání: 1 2 3 5
Jak je znázorněno ve výše uvedeném výstupu pro funkci změny velikosti, určujeme rozsah nebo polohu prvku, který má být vymazán nebo odstraněn. Ve výše uvedeném příkladu jsme určili pozici ukazující na první prvek ve vektoru.
Vložit prvky do vektoru
Třída vektoru std :: vector poskytuje ještě další funkci pro vložení hodnot do vektoru. Funkce Vložit nám umožňuje vložit prvky do vektoru před určenou pozici.
To bude zřejmé z následujícího pří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ýstup:
Počáteční vektor: 2 3 4
Nový vektor po vložení: 20 30 2 3 4
Výše uvedený program nejprve deklaruje vektor se 3 prvky. Poté dvakrát zavoláme funkci vložení, abychom vložili hodnoty 20 a 30 na první a druhou pozici ve vektoru. Poté zobrazíme změněný vektor.
Zaměňujte vektorový obsah
Třída vektorů nám také poskytuje možnost zaměnit nebo vyměnit obsah jednoho vektoru s jiným vektorem stejného typu a velikosti. Toho je dosaženo vektorovou vestavěnou funkcí „swap“.
Zvažte následující část 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ýstup:
Vektor 1: 1 3
Vektor 2: 5 7
Po výměně
Vektor 1: 5 7
Vektor 2: 1 3
Výše uvedený kód ukazuje obsah dvou vektorů před a po výměně.
Zúčtování hodnot ve vektoru
Na rozdíl od odstranění jednoho nebo více prvků z vektoru pomocí funkce mazání máme další funkci „Vymazat“, která nám umožňuje odstranit všechny prvky ve vektorovém kontejneru.
V níže uvedeném programu demonstrujeme jasnou funkci vektorového kontejneru.
#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ýstup:
Velikost vektoru v1: 4
Vektor 1: 1 3 5 7
Velikost vektoru v1 po volání funkce clear: 0
Zde nejprve deklarujeme vektor a poté do něj vložíme prvky. Jakmile funkci nazýváme clear (), vidíme, že všechny prvky ve vektoru jsou odstraněny najednou.
v (pos)
Tato funkce vrací odkaz na prvek na pozici „pos“ ve vektoru.
Toto je jedna z funkcí, která se používá pro přístup k vektorovému prvku.
Níže je uveden příklad:
#include #include using namespace std; int main() { // Assign vector vector myvec = {1,1,2,3,5,8}; cout<<'
Element at position 3 : '< Výstup:
Prvek na pozici 3: 3
Jak je znázorněno v příkladu, funkce „at“ se používá k přístupu k prvku ve vektoru v zadané poloze.
Přední
Funkce ‘vpředu’ vrací odkaz na první prvek vektoru. Toto je další funkce, kterou používáme pro přístup k prvkům vektorového kontejneru.
Následující příklad ukazuje použití funkce „přední“.
#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ýstup:
Vstupní vektor: 1 1 2 3 5 8
Prvek v přední části vektoru: 1
Zadní
Podobně jako u funkce „přední“ se funkce zpět používá k přístupu k poslednímu prvku vektorového kontejneru. Funkce „zpět“ vrací odkaz na poslední prvek ve vektorovém kontejneru.
Následující příklad ukazuje použití funkce „zpět“.
#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ýstup:
Vstupní vektor: 1 1 2 3 5 8
Prvek v zadní části vektoru: 8
Najděte prvek ve vektoru
Funkce „find“ se používá k nalezení, zda je ve vektoru určitý prvek (označovaný jako klíč), nebo ne. Tato funkce má být rychlá a efektivní. Jakmile je hodnota nalezena, funkce se vrátí.
Následující příklad ukazuje použití funkce 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ýstup:
Vstupní vektor: 1 1 2 3 5 8
Zadejte hledaný klíč: 0
Prvek nebyl nalezen
2D vektor
Dvojrozměrný vektor je také známý jako „Vektor vektoru“. Stejně jako dvourozměrná pole jsou také prvky dvojrozměrných vektorů uspořádány do maticového tvaru.
Níže je uveden příklad programu pro 2D vektor.
#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ýstup:
2D vektor:
1 3 5
7 9 11
13 15 17
Ve výše uvedeném příkladu si povšimněte způsobu, jakým je definován 2D vektor. Je definován jako vektor uvnitř jiného vektoru. Při zobrazování tohoto 2D vektoru používáme stejný přístup jako při zobrazování 2D polí.
Příklad vektoru
Níže je uveden vektorový příklad, který obsahuje většinu vektorových operací.
#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ýstup:
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
Velikost vektoru po vymazání: 5
Po vymazání prvního prvku: 10 10 10 10 10
c ++ pauza na 1 sekundu
Následuje snímek obrazovky pro totéž.

Ve výše uvedeném příkladu deklarujeme vektor a poté pomocí funkcí assign a push_back zadáme prvky do vektoru. Pak použijeme funkci pop_back k odebrání prvku z konce vektoru. Poté znovu přidáme jeden prvek do vektoru pomocí vloženého prvku a poté prvek vymažeme pomocí funkce mazání.
Toto je příklad end-to-end vektorového kontejneru, který demonstruje jeho různé funkce.
Závěr
S tímto jsme se dostali na konec tohoto tutoriálu o vektoru.
V našem nadcházejícím výukovém programu se dozvíme o „seznamu“ kontejneru STL, který je podobný řádkům polí a vektorů.
=> Podívejte se na průvodce Perfect C ++ Training Guide zde.
Doporučené čtení