Klasa i obiekty
Klasa to zestaw zmiennych i funkcji, które działają razem, w których zmienne nie mają przypisanych wartości. Gdy wartości są przypisywane do zmiennych, klasa staje się obiektem. Różne wartości podane tej samej klasie powodują różne obiekty; to znaczy różne obiekty mogą być tej samej klasy, ale mają różne wartości. Tworzenie obiektu z klasy jest również znane jako tworzenie instancji obiektu.
Termin wektor opisuje klasę. Obiekt utworzony z wektora ma nazwę wybraną przez programistę.
Potrzebna jest funkcja, która należy do klasy, aby utworzyć obiekt z klasy. W C ++ funkcja ta ma taką samą nazwę jak nazwa klasy. Różne obiekty utworzone (utworzone) z klasy mają wyraźne nazwy podane każdemu z nich przez programistę.
Tworzenie obiektu z klasy oznacza konstruowanie obiektu; Oznacza to również instancję obiektu.
Klasa wektorowa
Klasa wektorowa została już zdefiniowana i znajduje się w bibliotece. Aby korzystać z klasy wektorowej, programista musi uwzględnić nagłówek wektorowy w pliku z następującą dyrektywą wstępnego przetwarzania:
#włączać
Po uwzględnieniu nagłówka wszystkie funkcje wektorowe (funkcje danych i funkcje członków) stają się dostępne. Aby użyć obiektu Count do wyświetlania danych do terminalu (konsoli), należy również uwzględnić nagłówek obiektu. Aby napisać program z wektorem, jako minimum, należy uwzględnić następujące nagłówki:
#włączać
#włączać
Instatowanie wektora
int foo [10];
Powyżej znajduje się deklaracja tablicy o nazwie „foo” i liczba elementów „10.„To jest szereg liczb całkowitych. Deklaracja wektora jest podobna. W przypadku wektora liczba elementów jest opcjonalna, ponieważ długość wektora może zwiększyć lub zmniejszyć.
W tym momencie programu klasa wektorowa została już zdefiniowana w bibliotece, a nagłówek został uwzględniony. Wektor można utworzyć w następujący sposób:
STD :: wektorVTR (8);
Tutaj wektor ma specjalną funkcję konstruktora. Rodzaj danych, które wektor będzie przechowywać, to „int” w nawiasach kątowych. Termin „vtr” to nazwa wybrana przez programistę dla wektora. Wreszcie, „8” w nawiasach to wstępna liczba liczb całkowitych, jaką będzie miał wektor.
Termin „STD” oznacza standardowy przestrzeń nazw. Po tym terminie musi nastąpić podwójny okrężnica, w tym kontekście. Każdy może napisać własną bibliotekę klas wektorowych i korzystać z niej. Jednak C ++ ma już standardową bibliotekę o standardowych nazwach, w tym „wektor.„Aby użyć standardowej nazwy, standardowa nazwa musi być poprzedzona przez STD :: . Aby uniknąć wpisywania STD :: za każdym razem w programie dla standardowej nazwy, plik programu może rozpocząć się w następujący sposób:
#włączać
#włączać
za pomocą przestrzeni nazw Std;
Przeciążenie funkcji
Gdy dwa lub więcej różnych podpisów funkcji mają tę samą nazwę, mówi się, że ta nazwa jest przeciążona. Po wywołaniu jednej funkcji liczba i rodzaj argumentów określają, która funkcja jest wykonywana.
Konstruowanie wektora
Konstruowanie wektora oznacza instancję (tworzenie) obiektu wektorowego. Funkcja konstruktora jest przeciążona w następujący sposób:
Nazwa wektora
To tworzy wektor długości zero i typu „t.„Poniższe stwierdzenie tworzy wektor o zerowej długości typu„ Float ”z nazwą„ VTR: ”
wektorvtr;
Nazwa wektora (n)
To tworzy wektor z n elementami typu „T.„Oświadczenie dla tego wektora z czterema elementami pływakowymi jest następujące:
wektorVTR (4);
Nazwa wektora (n, t)
Tworzy to wektor n elementów zainicjowanych do wartości t. Poniższe stwierdzenie tworzy wektor 5 elementów, w którym każdy element ma wartość 3.4:
wektorVTR (5, 3.4);
Konstruowanie z inicjalizacją
Wektor można skonstruować (utworzyć) i zainicjować jednocześnie, na jeden z następujących dwóch sposobów:
wektorvtr = 1.1, 2.2, 3.3, 4.4;
Lub
wektorvtr 1.1, 2.2, 3.3, 4.4;
Zauważ, że nie ma nawiasów tuż po nazwie obiektu. Nawiasy używane tuż po nazwie obiektu powinny mieć listę inicjalizatora, w następujący sposób:
wektorvtr (1.1, 2.2, 3.3, 4.4);
Wektor można skonstruować i zainicjować później z listą inicjalizatora. W takim przypadku nawiasy nie będą używane:
wektorvtr;
vtr = 1.1, 2.2, 3.3, 4.4;
wektor v2 (v1)
To jest konstruktor kopii. Tworzy wektor v2 jako kopię wektora v1. Poniższy kod to ilustruje:
wektorVTR1 (5, 3.4);
wektorVTR2 (VTR1);
Przypisanie wektora podczas budowy
Podczas budowy można utworzyć pustego wektora, a inny jest do niego przypisany, w następujący sposób:
wektorVTR1 1.1, 2.2, 3.3, 4.4;
wektorvtr2 = vtr1;
Drugie stwierdzenie jest równoważne:
wektorvtr2 = 1.1, 2.2, 3.3, 4.4;
Conster wektor
Conster wektor jest wektorem, którego elementów nie można zmienić. Wartości w tym wektorze są tylko do odczytu. Po utworzeniu wektor pojawia się w następujący sposób:
Conster wektorvtr 1.1, 2.2, 3.3, 4.4;
W tym typie wektora nie można dodać ani usuwać elementu. Ponadto nie można zmienić żadnej wartości.
Konstruowanie z iteratorem
Szablon zapewnia ogólną reprezentację dla typu danych. Iterator zapewnia ogólną reprezentację skanowania poprzez wartości pojemnika. Składnia do utworzenia wektora z iteratorem jest następująca:
szablon
wektor (inputiterator pierwszy, inuputiterator last, const alokator & = alokator ());
To konstruuje wektor dla zakresu [pierwszy, ostatni) za pomocą określonego alokatora, który zostanie omówiony w dalszej części tego artykułu.
Niszczenie wektora
Aby zniszczyć wektor, po prostu pozwól mu wyjść z zakresu, a niszczenie jest obsługiwane automatycznie.
Pojemność wektorowa
size_typ Constal () const no -except
Całkowita liczba elementów, które wektor może przechowywać bez wymagania realokacji, jest zwracana przez funkcję członka pojemności. Segment kodu dla tego jest następujący:
wektorVTR (4);
int num = vtr.pojemność();
Cout << num << '\n';
Wyjście to 4.
Rezerwa (N)
Przestrzeń pamięci nie zawsze jest dostępna. Dodatkowa przestrzeń może być zarezerwowana z wyprzedzeniem. Rozważ następujący segment kodu:
wektorVTR (4);
vtr.rezerwę (6);
Cout << vtr.capacity() << '\n';
Wyjście to 6. Więc dodatkowa przestrzeń zarezerwowana wynosi 6 - 4 = 2 elementy. Funkcja zwraca pustkę.
rozmiar () const no -except
Zwraca to liczbę elementów w wektorze. Poniższy kod ilustruje tę funkcję:
wektorVTR (4);
float sz = vtr.rozmiar();
Cout << sz << '\n';
Wyjście to 4.
Shrink_to_fit ()
Po podaniu dodatkowej pojemności wektorowi z funkcją rezerwową () wektor może być rozmiar. Poniższy kod to ilustruje:
wektorVTR (4);
vtr.rezerwę (6);
vtr.Shrink_to_fit ();
int sz = vtr.rozmiar();
Cout << sz << '\n';
Wyjście to 4, a nie 6. Funkcja zwraca pustkę.
Zmiana zmiany zmiany rozmiaru, rozmiar (Sz, c)
To zmienia rozmiar wektora. Jeśli nowy rozmiar jest mniejszy niż stary rozmiar, wówczas elementy pod koniec są wymazane. Jeśli nowy rozmiar jest dłuższy, pod koniec dodaje się pewna wartość domyślna. Aby mieć określoną wartość dodaną, użyj funkcji ReSize () z dwoma argumentami. Poniższy segment kodu ilustruje użycie tych dwóch funkcji:
wektorVTR1 1.1, 2.2, 3.3, 4.4;
VTR1.rozmiar (2);
Cout << "New size of vtr1: " << vtr1.size() << '\n';
wektorVTR2 1.1, 2.2;
VTR2.Zmień rozmiar (4, 8.8);
Cout << "vtr2: "<< vtr2[0] <<" "<< vtr2[1] <<"
"<< vtr2[2] <<" "<< vtr2[3] << '\n';
Wyjście jest następujące:
Nowy rozmiar VTR1: 2
VTR2: 1.1 2.2 8.8 8.8
Funkcje zwracają pustkę.
pusty () const no -except
Ta funkcja zwraca 1 dla true, jeśli nie ma elementów w wektorze i 0 dla fałszywego, jeśli wektor jest pusty. Jeśli wektor ma 4 lokalizacje dla określonego rodzaju danych, takich jak pływak, bez żadnej wartości zmiennoprzecinkowej, ten wektor nie jest pusty. Poniższy kod to ilustruje:
wektorvtr;
Cout << vtr.empty() << '\n';
wektorVT (4);
Cout << vt.empty() << '\n';
wektorv (4,3.5);
Cout << v.empty() << '\n';
Wyjście jest następujące:
1Dostęp do elementu wektora
Wektor można podsensać (indeksować) jak tablica. Liczenie indeksu zaczyna się od zera.
VECTORNAME [i]
Operacja „VECTONMAME [i]” zwraca odniesienie do elementu na ith indeks wektora. Następujące wyniki kodu 3.3 dla powyższego wektora:
wektorvtr 1.1, 2.2, 3.3, 4.4;
float fl = vtr [2];
Cout << fl << '\n';
VECTORNAME [i] const
Operacja „VECTONMAME [i] const” jest wykonywana zamiast „VectorName [i]”, gdy wektor jest stałym wektorem. Ta operacja jest używana w następującym kodzie:
Conster wektorvtr 1.1, 2.2, 3.3, 4.4;
float fl = vtr [2];
Cout << fl << '\n';
Wyrażenie zwraca stałe odniesienie do ith element wektora.
Przypisanie wartości z indeksem dolnym
Wartość można przypisać do wektora nieokreślonego, w następujący sposób:
wektorvtr 1.1, 2.2, 3.3, 4.4;
vtr [2] = 8.8;
Cout << vtr[2] << '\n';
Wyjście to 8.8.
VECTORNAME.w (i)
„VECTONName.w (i) ”jest jak„ VectorName [i] ”, ale„ VectorName.w (i) ”jest bardziej niezawodny. Poniższy kod pokazuje, w jaki sposób należy użyć tego wektora:
wektorvtr 1.1, 2.2, 3.3, 4.4;
float fl = vtr.w (2);
Cout << fl << '\n';
at () jest funkcją członka wektorowego.
VECTORNAME.w (i) const
„VECTONName.At (i) const ”jest jak„ VectorName [i] const ”, ale„ VectorName.w (i) const ”jest bardziej niezawodny. „VECTONName.w (i) const ”jest wykonywane zamiast„ VECTORName.w (i) ”, gdy wektor jest stałym wektorem. Ten wektor jest używany w następującym kodzie:
Conster wektorvtr 1.1, 2.2, 3.3, 4.4;
float fl = vtr.w (2);
Cout << fl << '\n';
at () const jest funkcją członka wektorowego.
Przypisanie wartości z funkcją AT ()
Wartość można przypisać do wektora nieksięgowego z funkcją AT (), w następujący sposób:
wektorvtr 1.1, 2.2, 3.3, 4.4;
vtr.w (2) = 8.8;
Cout << vtr[2] << '\n';
Wyjście to 8.8.
Problem z subskrypcją
Problem z podskrypcją (indeksowanie) polega na tym, że jeśli indeks jest poza zasięgiem, zero może zostać zwrócone lub błąd może zostać wydany w czasie wykonywania.
przód()
Zwraca to odniesienie do pierwszego elementu wektora bez usuwania elementu. Wyjście następującego kodu to 1.1.
wektorvtr 1.1, 2.2, 3.3, 4.4;
float fl = vtr.przód();
Cout << fl << '\n';
Element nie jest usuwany z wektora.
front () const
Gdy konstrukcja wektorowa jest poprzedzona const, wyrażenie „front () const” jest wykonywane zamiast „front ().„Jest to używane w następującym kodzie:
Conster wektorvtr 1.1, 2.2, 3.3, 4.4;
float fl = vtr.przód();
Cout << fl << '\n';
Zwracane jest stałe odniesienie. Element nie jest usuwany z wektora.
z powrotem()
Zwraca to odniesienie do ostatniego elementu wektora bez usuwania elementu. Wyjście następującego kodu to 4.4.
wektorvtr 1.1, 2.2, 3.3, 4.4;
float fl = vtr.z powrotem();
Cout << fl << '\n';
back () const
Gdy konstrukcja wektorowa jest poprzedzona const, wyrażenie „back () const” jest wykonywane zamiast „back ().„Jest to używane w następującym kodzie:
Conster wektorvtr 1.1, 2.2, 3.3, 4.4;
float fl = vtr.z powrotem();
Cout << fl << '\n';
Zwracane jest stałe odniesienie. Element nie jest usuwany z wektora.
Wektorowy dostęp do danych
data () noExcept; data () const noExcept;
Każdy z tych zwraca wskaźnik tak, że [data (), data () + size ()) jest prawidłowym zakresem.
Zostanie to szczegółowo omówione w dalszej części artykułu.
Powracające iteratory i wektor
Iterator jest jak wskaźnik, ale ma większą funkcjonalność niż wskaźnik.
początek () no -y -COUNT
Zwraca iterator, który wskazuje pierwszy element wektora, jak w następującym segmencie kodu:
wektorvtr 1.1, 2.2, 3.3, 4.4;
wektor:: iterator iter = vtr.zaczynać();
Cout << *iter << '\n';
Wyjście to 1.1. Zwróć uwagę, że deklaracja, która otrzymuje iterator, została zadeklarowana. Iterator jest dereferencyjny w wyrażeniu powrotnym, aby uzyskać wartość w taki sam sposób, jak wskaźnik jest dereferencyjny.
początek () const noxcept;
Zwraca iterator, który wskazuje na pierwszy element wektora. Gdy konstrukcja wektorowa jest poprzedzona const, wyrażenie „start () const” jest wykonywane zamiast „begin ().”W tym stanie nie można zmodyfikować odpowiedniego elementu w wektorze. Jest to używane w następującym kodzie:
Conster wektorvtr 1.1, 2.2, 3.3, 4.4;
wektor:: const_iterator iter = vtr.zaczynać();
Cout << *iter << '\n';
Wyjście to 1.1. Zauważ, że tym razem użyto „const_iterator” zamiast tylko „iteratora”, aby otrzymać zwrócony iterator.
end () no -y -ctcept
Zwraca iterator, który wskazuje natychmiast poza ostatni element wektora. Rozważ następujący segment kodu:
wektorvtr 1.1, 2.2, 3.3, 4.4;
wektor:: iterator iter = vtr.koniec();
Cout << *iter << '\n';
Wyjście to 0, co jest bez znaczenia, ponieważ nie ma elementu betonu poza ostatnim elementem.
end () const no -except
Zwraca iterator, który wskazuje natychmiast poza ostatni element wektora. Gdy konstrukcja wektorowa jest poprzedzona „const”, wyrażenie „end () const” jest wykonywane zamiast „end ().”Rozważ następujący segment kodu:
Conster wektorvtr 1.1, 2.2, 3.3, 4.4;
wektor:: const_iterator iter = vtr.koniec();
Cout << *iter << '\n';
Wyjście to 0. Zauważ, że tym razem użyto „const_iterator” zamiast tylko „iteratora”, aby otrzymać zwrócony iterator.
Odwrotna iteracja
Możliwe jest posiadanie iteratora od końca do końca do pierwszego elementu.
rbegin () no -except
Zwraca iterator, który wskazuje ostatni element wektora, jak w następującym segmencie kodu:
wektorvtr 1.1, 2.2, 3.3, 4.4;
wektor:: reverse_iterator riter = vtr.rbegin ();
Cout << *rIter << '\n';
Wyjście to 4.4.
Zwróć uwagę, że deklaracja, która odbiera odwrotny iterator, została zadeklarowana. Iterator jest dereferencyjny w wyrażeniu powrotnym, aby uzyskać wartość w taki sam sposób, jak wskaźnik jest dereferencyjny.
rbegin () const noxcept;
Zwraca iterator, który wskazuje ostatni element wektora. Gdy konstrukcja wektorowa jest poprzedzona „const”, wyrażenie „rbegin () const” jest wykonywane zamiast „rbegin ().”W tym stanie nie można zmodyfikować odpowiedniego elementu w wektorze. Ta funkcja jest używana w następującym kodzie:
Conster wektorvtr 1.1, 2.2, 3.3, 4.4;
wektor:: const_reverse_iterator riter = vtr.rbegin ();
Cout << *rIter << '\n';
Wyjście to 4.4.
Zauważ, że tym razem użyto const_reverse_iterator, zamiast tylko odwrotnego_.
Rend () no -y -COUNT
Zwraca iterator, który wskazuje tuż przed pierwszym elementem wektora. Rozważ następujący segment kodu:
wektorvtr 1.1, 2.2, 3.3, 4.4;
wektor:: reverse_iterator riter = vtr.rozdzierać();
Cout << *rIter << '\n';
Wyjście to 0, co jest bez znaczenia, ponieważ nie ma elementu betonu tuż przed pierwszym elementem.
Rend () const no -except
Zwraca iterator, który wskazuje tuż przed pierwszym elementem wektora. Gdy konstrukcja wektorowa jest poprzedzona „const”, wyrażenie „Rend () const” jest wykonywane zamiast „Rend ().”Rozważ następujący segment kodu:
Conster wektorvtr 1.1, 2.2, 3.3, 4.4;
wektor:: const_reverse_iterator riter = vtr.rozdzierać();
Cout << *rIter << '\n';
Wyjście to 0.
Zauważ, że tym razem użyto const_reverse_iterator, zamiast tylko odwrotnego_.
Modyfikatory wektorowe
Modyfikator, który modyfikuje wektor, może wziąć lub zwrócić iterator.
A.emplace (p, args)
Wstaw obiekt typu T zbudowany ze std :: napastnik (args)… przed p.
Szczegółowe informacje - patrz później
wstaw (IteratorPosition, wartość)
Wstawia kopię wartości w pozycji iteratora wektora. Zwraca iterator (pozycję) w wektorze, w którym umieszczono kopię. Poniższy kod pokazuje, gdzie umieszczono wartość:
wektorvtr 10, 20, 30, 40;
wektor:: iterator iter = vtr.zaczynać();
++iter;
++iter;
vtr.Wstaw (ITER, 25);
Cout << vtr[1] << " << vtr[2]<< '
' << vtr[3] << '\n';
Wyjście to: 20 25 30.
Zauważ, że iterator był zaawansowany (przyrostowy), podobnie jak wskaźnik.
Można również wstawić listę inicjalizatora, jak pokazuje następujący kod:
wektorvtr 10, 20, 30, 40;
wektor:: iterator iter = vtr.zaczynać();
++iter;
++iter;
vtr.insert (iter, 25, 28);
Cout << vtr[1] << " << vtr[2]<< '
' << vtr[3]<< " << vtr[4] << '\n';
Wyjście to: 20 25 28 30.
usunąć (pozycję)
Usuwa element w pozycji wskazanej przez iterator, a następnie zwraca pozycję iteratora. Poniższy kod to ilustruje:
wektorvtr 10, 20, 30, 40;
wektor:: iterator iter = vtr.zaczynać();
++iter;
++iter;
vtr.usunąć (itera);
Cout << vtr[0] << " << vtr[1] << '
' << vtr[2]<< '\n';
Wyjście to: 10 20 40
push_back (t), push_back (rv)
Służy do dodania pojedynczego elementu na końcu wektora. Użyj push_back (t) w następujący sposób:
wektorvtr 1.1, 2.2, 3.3, 4.4;
vtr.push_back (5.5);
float fl = vtr [4];
Cout << fl << '\n';
Wyjście to 5.5.
push_back (rv): - patrz później.
pop_back ()
Usuwa ostatni element bez zwracania. Rozmiar wektora jest zmniejszony o 1. Poniższy kod to ilustruje:
wektorvtr 1.1, 2.2, 3.3, 4.4;
vtr.pop_back ();
float sz = vtr.rozmiar();
Cout << sz << '\n';
Wyjście to 3.
A.zamiana (b)
Dwa wektory można zamienić, jak pokazano w następującym segmencie kodu:
wektorVTR1 1.1, 2.2, 3.3, 4.4;
wektorvtr2 10, 20;
VTR1.swap (vtr2);
Cout << "vtr1: "<< vtr1[0] <<" "<< vtr1[1] <<"
"<< vtr1[2] <<" "<< vtr1[3] << '\n';
Cout << "vtr2: "<< vtr2[0] <<" "<< vtr2[1] <<"
"<< vtr2[2] <<" "<< vtr2[3] << '\n';
Wyjście to:
VTR1: 10 20 0 0
VTR2: 1.1 2.2 3.3 4.4
Zauważ, że długość wektora jest zwiększona, jeśli to konieczne. Ponadto wartości, które nie miały zamienników, są zastąpione pewną wartością domyślną.
jasne()
Usuwa wszystkie elementy z wektora, jak ilustruje następujący segment kodu:
wektorvtr 1.1, 2.2, 3.3, 4.4;
vtr.jasne();
Cout << vtr.size() << '\n';
Wyjście to 0.
Operatorzy równości i relacyjnych dla wektorów
Operator ==
Zwraca 1 dla True, jeśli dwa wektory mają ten sam rozmiar, a odpowiednie elementy są równe; W przeciwnym razie zwraca 0 dla fałszu. Na przykład:
wektorU 1, 2, 3;
wektorV 4, 5, 6;
Bool Bl = u == V;
Cout << bl << '\n';
Wyjście to 0.
!= Operator
Zwraca 1 dla True, jeśli dwa wektory nie mają takiego samego rozmiaru i/lub odpowiadających elementach nie są równe; W przeciwnym razie zwraca 0 dla fałszu. Na przykład:
wektorU 1, 2, 3;
wektorV 4, 5, 6;
bool bl = u!= V;
Cout << bl << '\n';
Wyjście to 1.
< Operator
Zwraca 1 dla true, jeśli pierwszy wektor jest początkowym podzbiorem drugiego wektora, przy czym elementy dwóch równych porcji są takie same i w tej samej kolejności. Jeśli oba wektory są tego samego rozmiaru i poruszają się od lewej do prawej, a element jest napotykany w pierwszym wektorze, który jest mniejszy niż odpowiedni element w drugim wektorze, wówczas 1 będzie nadal zwrócony. W przeciwnym razie zwracany jest 0 dla fałszywego. Na przykład:
wektorU 3, 1, 1;
wektorV 3, 2, 1;
bool bl = uCout << bl << '\n';
Wyjście to 1. < does not include the case when the size and order are the same.
Operator>
Zwroty !(U < V), where U is the first vector and V is the second vector, according to the above definitions.
<= Operator
Zwraca u <= V, where U is the first vector and V is the second vector, according to the above definitions.
> = Operator
Zwroty !(U <= V), where U is the first vector and V is the second vector, according to the above definitions.
Wniosek
Wektor jest przykładem pojemnika sekwencyjnego. Wektor jest „lepszą” formą zwykłej tablicy i jest tworzona z klasy. Wektory mają metody sklasyfikowane: budowa i przypisanie, pojemność, dostęp do elementów, dostęp do danych, iteratory, modyfikatory i liczbowe operatory przeciążone.
Istnieją inne kontenery sekwencyjne, zwane listą, napastnik_list i tablicy. Jeśli zadanie obejmuje częste wstawienia i usunięcia w środku sekwencji, należy użyć listy lub listy_przedzysłu. Jeśli zadanie obejmuje częste wstawienia i delecje na początku lub na końcu sekwencji, należy użyć deque. I tak wektory powinny być używane tylko wtedy, gdy tego rodzaju operacje nie są ważne.