vectors stl
Rola wektorów w STL z przykładami.
Do tej pory w tej serii C ++ widzieliśmy tablice statyczne o stałym rozmiarze.
Jeśli w środku programu musimy przechowywać więcej elementów w tablicy, to staje się to niemożliwe i na pewno otrzymamy wyjątek „out_of_bound”, w momencie próby przechowywania elementów poza granicami tablicy.
Jednym z rozwiązań jest zadeklarowanie tablicy z maksymalną pojemnością, dzięki czemu nie będziemy mieć problemu z przechowywaniem większej liczby elementów w czasie wykonywania. Ale taki układ ma poważną wadę polegającą na tym, że marnujemy zbyt dużo pamięci.
=> Sprawdź całą serię szkoleń C ++ tutaj.
Odpowiedzią na wszystkie te problemy jest użycie dynamicznej tablicy, która będzie się sama rozszerzać w miarę potrzeb. STL udostępnia tę dynamiczną tablicę w postaci kontenera wektorowego.
Czego się nauczysz:
- Jak definiujemy wektory?
- Deklarowanie wektora w C ++ z klasą std :: Vector
- Zainicjuj Vector
- Iterator wektorów
- Funkcje wektorowe
- Pojemność wektora
- Modyfikatory wektorów
- Wektor 2D
- Przykład wektora
- Wniosek
- rekomendowane lektury
Jak definiujemy wektory?
Wektory to dynamiczne kontenery tablicowe, które automatycznie zmieniają rozmiar, gdy elementy są wstawiane lub usuwane. Przechowywanie wektora jest obsługiwane przez sam kontener wektora.
Elementy wektora są przechowywane w sąsiadujących lokalizacjach. Podobnie jak w przypadku tablic, elementy wektorowe również można przechodzić i uzyskiwać do nich dostęp za pomocą iteratorów.
Deklarowanie wektora w C ++ z klasą std :: Vector
W klasie wektorów STL „ std :: vector ”Jest zdefiniowana pod nagłówkiem. Dlatego, aby użyć kontenera wektorowego, powinniśmy dołączyć ten nagłówek do naszego programu, jak pokazano poniżej:
#include
Możemy zadeklarować pusty wektor, jak pokazano poniżej:
std::vector myvec;
Powyższy wiersz kodu utworzy wektor z elementami typu integer. W pamięci zostanie to przedstawione jako myvec.
Zainicjuj Vector
Możemy zainicjować wektor wartością w momencie jego deklarowania.
okulary wirtualnej rzeczywistości na konsolę Xbox 360
Odbywa się to w następujący sposób:
#include int main() { std::vector myvec = {1, 1, 2, 3, 5}; }
W powyższym kodzie deklarujemy wektor typu int o nazwie myvec zawierający pięć pierwszych elementów ciągu Fibonacciego.
Układ pamięci tego wektora będzie następujący:
Iterator wektorów
Jak już wspomniano, używamy iteratorów do sekwencyjnego przechodzenia przez wektor.
Wektory obsługują następujące funkcje iteratora do przechodzenia przez elementy:
- zaczynać() - Zwraca iterator wskazujący na pierwszy element kontenera wektora.
- koniec() - Zwraca iterator wskazujący na element, który następuje po ostatnim elemencie w wektorze.
- rbegin () - Zwraca iterator odwrotny wskazujący na ostatni element w kontenerze wektora.
- renderowanie () - Zwraca iterator odwrotny wskazujący na pierwszy element kontenera wektora.
- cbegin () - Zwraca stały iterator wskazujący na pierwszy element w kontenerze wektora.
- kilka() - Zwraca stałą iterator wskazującą na element następujący po ostatnim elemencie kontenera wektora.
- crbegin () - Zwraca iterator odwrotnej stałej wskazujący ostatni element w kontenerze wektora.
- crend () - Zwraca iterator odwrotnej stałej wskazujący na pierwszy element w kontenerze wektora.
Zobaczmy przykład, który zademonstruje te funkcje iteratora.Pozostałe funkcje mogą być używane podobnie.
#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; }
Wynik:
Wyjście Vector z początkiem i końcem: 2 3 4 5 6
Wyjście Vector z rbegin i rend: 6 5 4 3 2
Wyjściowy wektor z cbegin i cend: 2 3 4 5 6
Wyjście Wektor z crbegin i crend: 6 5 4 3 2
Tak więc w tym kodzie deklarujemy wektor i wstawiamy do niego wartości za pomocą funkcji push_back. Następnie wyświetlamy wektory za pomocą każdej z funkcji iteratora, które opisaliśmy powyżej. Jak widać z danych wyjściowych, w zależności od użytych funkcji iteratora, kolejność wyświetlania wektora zmienia się.
Funkcje wektorowe
Sortowanie wektora
Możemy użyć algorytmów STL, które widzieliśmy już na wektorze.
Poniżej podano przykład użycia funkcji „Sortuj” na wektorze.
#include #include #include using namespace std; int main() { vector myvec = {10,50,30,20,60,40}; cout<<'Original Vector'< Wynik:
Oryginalny wektor
10 50 30 20 60 40
Posortowane wektor
10 20 30 40 50 60
W powyższym przykładzie zainicjowaliśmy wektor, a następnie zastosowaliśmy algorytm sortowania do sortowania wektora.
Drukowanie elementów wektora
Wektory można drukować za pomocą iteratora i strumienia „cout”. Możemy użyć iteratora, aby przejść przez każdy z elementów wektora i wydrukować je za pomocą cout.
Poniższy przykład pokazuje to:
#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 << ' '; }
Wynik:
Wyjście Vector z początkiem i końcem: 3 4 5 6 7
Pojemność wektora
Istnieją różne funkcje, które działają na wektory w celu określenia jego rozmiaru, maksymalnego rozmiaru itp.
Poniżej wymieniono funkcje:
(i) Rozmiar wektora
Funkcja size () zwraca liczbę elementów w kontenerze wektora. Jest to wbudowana funkcja klasy std :: vector i może być używana bezpośrednio do znalezienia rozmiaru wektora.
narzędzie do naprawy błędów dla systemu Windows 10
Zobaczmy przykład wektora używającego funkcji size ():
#include #include using namespace std; int main() { vector myvec = {1, 1, 2, 3, 5, 8}; cout << 'Vector Size : ' << myvec.size(); return 0; }
Wynik:
Rozmiar wektora: 6
W powyższym programie zdefiniowaliśmy wektor myvec składający się z sześciu elementów. Następnie wywołujemy funkcję size () w myvec i wyświetla ona prawidłowy rozmiar.
(ii) Zmiana rozmiaru wektora
Możemy również zmienić rozmiar wektora do pożądanego rozmiaru, tak aby mógł pomieścić „n” liczby elementów. Osiąga się to za pomocą funkcji „resize ()” klasy std :: vector. Funkcja resize przyjmuje rozmiar wektora jako parametr, a następnie zmienia rozmiar kontenera wektora do określonego rozmiaru.
Zrozummy to na przykładzie.
#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; }
Wynik:
Elementy wektorowe to: 1 1 2 3 5 8
Rozmiar wektora po zmianie rozmiaru: 4
Elementy wektorowe po zmianie rozmiaru to: 1 1 2 3
W powyższym programie wstępnie definiujemy wektor myvec o rozmiarze 6. Następnie wywołujemy funkcję resize na tym wektorze o rozmiarze = 4. Oznacza to, że chcemy teraz zmienić rozmiar naszego wektora do rozmiaru 4.
Po wywołaniu funkcji resize ponownie drukujemy wektor. Widzimy, że kiedy zmieniamy rozmiar wektora do rozmiaru 4, pozostałe elementy są odrzucane i wyświetlane są tylko 4 elementy wektora.
Oprócz funkcji size i resize, klasa vector obsługuje również kilka innych funkcji, które pozwalają nam manipulować pojemnością wektora. Oni są:
- największy rozmiar(): Zwraca maksymalny rozmiar, tj. Maksymalną liczbę elementów, które może pomieścić wektor.
- Pojemność(): Zwraca rozmiar aktualnie przydzielonego miejsca w pamięci. Jest to zwracane w postaci liczby elementów.
- pusty(): Sprawdza, czy pojemnik jest pusty.
- shrink_to_fit (): Zmniejsza pojemność wektora, aby dopasować go do rozmiaru, i odrzuca wszystkie inne elementy.
- rezerwować(): Rezerwuje pojemność wektora, aby zawierała n elementów.
Modyfikatory wektorów
Modyfikatory to operacje lub funkcje, których można użyć do zmodyfikowania zawartości kontenera wektora. Zobaczymy niektóre z głównych funkcji, które są używane jako modyfikatory.
Przypisywanie nowych wartości do wektora
Jedną z funkcji modyfikatorów udostępnianych przez std :: vector jest funkcja przypisania. Funkcja Assign przypisuje nowe wartości do wektora, zastępując stare.
Jest to pokazane w poniższym przykładzie.
#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] << ' '; }
Wynik:
Elementy wektorowe: 10 10 10 10 10
W powyższym kodzie deklarujemy wektor typu int. Następnie wywołujemy przypisanie funkcji o parametrach 5, 10. Oznacza to, że zamierzamy przypisać element 10 do wektora 5 razy. Kiedy wyświetlamy wektor, widzimy, że wektor ma 5 elementów, wszystkie o wartości 5.
Kasowanie wektora
Następną funkcją zapewnianą przez std :: vector do modyfikowania wektora jest funkcja „erase”. Funkcja Erase usuwa elementy z określonego zakresu lub pozycji z wektora.
Zobaczmy przykład funkcji Erase.
#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: '< Wynik:
Elementy wektorowe: 1 1 2 3 5
Rozmiar wektora po skasowaniu: 4
Wektor po operacji kasowania: 1 2 3 5
Jak pokazano na powyższym wyjściu dla funkcji zmiany rozmiaru, określamy zakres lub pozycję elementu do usunięcia lub usunięcia. W powyższym przykładzie określiliśmy położenie wskazujące na pierwszy element w wektorze.
Wstaw elementy do wektora
Klasa wektora std :: vector zapewnia jeszcze jedną funkcję wstawiania wartości do wektora. Funkcja Insert umożliwia wstawianie elementów do wektora przed określoną pozycją.
Będzie to jasne na poniższym przykładzie.
#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] << ' '; }
Wynik:
Wektor początkowy: 2 3 4
Nowy wektor po wstawieniu: 20 30 2 3 4
Powyższy program początkowo deklaruje wektor z 3 elementami. Następnie dwukrotnie wywołujemy funkcję wstawiania, aby wstawić wartości 20 i 30 odpowiednio na pierwszej i drugiej pozycji w wektorze. Następnie wyświetlamy zmieniony wektor.
Zamiana zawartości wektorów
Klasa vector daje nam także możliwość zamiany lub zamiany zawartości jednego wektora na inny wektor tego samego typu i rozmiaru. Osiąga się to dzięki wbudowanej funkcji wektorowej „swap”.
Rozważ następujący fragment kodu.
#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] << ' '; }
Wynik:
Wektor 1: 1 3
Wektor 2: 5 7
Po zamianie
Wektor 1: 5 7
Wektor 2: 1 3
Powyższy kod pokazuje zawartość dwóch wektorów przed i po zamianie.
Czyszczenie wartości w wektorze
W przeciwieństwie do usuwania jednego lub więcej elementów z wektora za pomocą funkcji erase, mamy inną funkcję „Clear”, która pozwala nam usunąć wszystkie elementy z kontenera wektora.
W poniższym programie przedstawiamy wyraźną funkcję kontenera wektorowego.
#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: '< Wynik:
Rozmiar wektora v1: 4
Wektor 1: 1 3 5 7
Rozmiar wektora v1 po wywołaniu funkcji clear: 0
Tutaj najpierw deklarujemy wektor, a następnie wpychamy do niego elementy. Gdy wywołasz funkcję clear (), zobaczymy, że wszystkie elementy w wektorze są usuwane jednocześnie.
w (pos)
Ta funkcja zwraca odniesienie do elementu w pozycji „pos” w wektorze.
Jest to jedna z funkcji używanych do uzyskania dostępu do elementu wektora.
Poniżej podano przykład:
#include #include using namespace std; int main() { // Assign vector vector myvec = {1,1,2,3,5,8}; cout<<'
Element at position 3 : '< Wynik:
Element w pozycji 3: 3
Jak pokazano w przykładzie, funkcja „at” służy do uzyskania dostępu do elementu w wektorze w określonej pozycji.
Z przodu
Funkcja „front” zwraca odniesienie do pierwszego elementu wektora. To kolejna funkcja, której używamy, aby uzyskać dostęp do elementów kontenera wektorowego.
fazy cyklu życia rozwoju systemu wraz z przykładami
Poniższy przykład pokazuje użycie funkcji „przód”.
#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 Wynik:
Wektor wejściowy: 1 1 2 3 5 8
Element z przodu wektora: 1
Z powrotem
Podobnie do funkcji „front”, funkcja back jest używana do uzyskania dostępu do ostatniego elementu kontenera wektorowego. Funkcja „back” zwraca odwołanie do ostatniego elementu w kontenerze wektora.
Poniższy przykład przedstawia użycie funkcji „wstecz”.
#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 Wynik:
Wektor wejściowy: 1 1 2 3 5 8
Element z tyłu wektora: 8
Znajdź element w wektorze
Funkcja „znajdź” służy do sprawdzenia, czy określony element (określany jako klucz) jest obecny w wektorze, czy nie. Ta funkcja ma być szybka i wydajna. Po znalezieniu wartości funkcja zwraca.
Poniższy przykład ilustruje użycie funkcji wyszukiwania.
#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'; }
Wynik:
Wektor wejściowy: 1 1 2 3 5 8
Wpisz klucz do wyszukania: 0
Nie znaleziono elementu
Wektor 2D
Dwuwymiarowy wektor jest również znany jako „wektor wektora”. Podobnie jak tablice dwuwymiarowe, elementy wektorów dwuwymiarowych również są ułożone w postaci macierzy.
Przykładowy program dla wektora 2D jest podany poniżej.
#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< Wynik:
Wektor 2D:
1 3 5
7 9 11
13 15 17
W powyższym przykładzie zwróć uwagę na sposób, w jaki zdefiniowano wektor 2D. Jest definiowany jako wektor wewnątrz innego wektora. Podczas wyświetlania tego wektora 2D stosujemy to samo podejście, co przy wyświetlaniu tablic 2D.
Przykład wektora
Poniżej podano przykład wektora, który zawiera większość operacji na wektorach.
#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: '< Wynik:
Elementy wektorowe: 10 10 10 10 10
Nowy wektor po push_back: 10 10 10 10 10 5
Nowy wektor po pop_back: 10 10 10 10 10
Nowy wektor po wstawieniu: 20 10 10 10 10 10
Rozmiar wektora po skasowaniu: 5
Po skasowaniu pierwszego elementu: 10 10 10 10 10
Poniżej znajduje się zrzut ekranu tego samego.
W powyższym przykładzie deklarujemy wektor, a następnie za pomocą funkcji assign i push_back wprowadzamy elementy w wektorze. Następnie używamy funkcji pop_back, aby usunąć element z końca wektora. Następnie ponownie dodajemy jeden element do wektora za pomocą elementu insert, a następnie usuwamy element za pomocą funkcji erase.
To jest kompleksowy przykład kontenera wektorowego demonstrujący jego różne funkcje.
Wniosek
W ten sposób doszliśmy do końca tego samouczka dotyczącego wektora.
W naszym nadchodzącym samouczku dowiemy się o kontenerze „list” STL, który jest podobny do linii tablic i wektorów.
=> Sprawdź doskonały przewodnik szkoleniowy C ++ tutaj.
rekomendowane lektury