Hur man använder C ++ Vector

How Use C Vector



Introduktion

En array är en serie av samma objekttyper i på varandra följande minnesplatser. En matris kan inte öka eller minska längden. En vektor är som en array, men dess längd kan ökas eller minskas. En vektor har därför många fler operationer än en array.

C ++ har många bibliotek, som alla utgör C ++ standardbibliotek. Ett av dessa bibliotek är containerbiblioteket. En behållare är en samling objekt och vissa operationer kan utföras på samlingen. C ++ - behållare kan grupperas i två uppsättningar: sekvensbehållare och associativa behållare. Sekvensbehållare är vektor, array (inte samma array som diskuterats tidigare), deque, forward_list och lista. Dessa är olika samlingar (matrisliknande datastrukturer), och var och en erbjuder olika avvägningar.







Alla programmerare bör veta hur de ska bestämma om de ska använda en vektor, en array, en deque, en forward_list eller en lista. När en programmerare behöver en struktur som kräver fler operationer än de som är associerade med en vanlig matris, bör den vanliga matrisen inte användas.



Om uppgiften innefattar frekventa infogningar och raderingar i mitten av sekvensen, bör en lista eller forward_list användas. Om uppgiften innefattar frekventa infogningar och raderingar i början eller slutet av en sekvens, bör en deque användas. En vektor bör användas när denna typ av operationer inte krävs.



Den här artikeln visar dig hur du använder C ++ - vektorn. Du behöver lite kunskap om C ++ -pekare, referenser och matriser för att förstå den här artikeln.





Klass och objekt

En klass är en uppsättning variabler och funktioner som fungerar tillsammans, där variablerna inte har tilldelade värden. När värden tilldelas variablerna blir en klass ett objekt. Olika värden som ges till samma klass resulterar i olika objekt; det vill säga olika objekt kan vara av samma klass men ha olika värden. Att skapa ett objekt från en klass är också känt som att instantiera objektet.

Termen vektor beskriver en klass. Ett objekt skapat från en vektor har ett namn som väljs av programmeraren.



En funktion som tillhör en klass behövs för att instantiera ett objekt från klassen. I C ++ har den funktionen samma namn som klassens namn. Olika objekt skapade (instanserade) från klassen har olika namn som programmeraren har gett var och en av dem.

Att skapa ett objekt från en klass innebär att konstruera objektet; det betyder också att instansera objektet.

Vektorklassen

Vektorklassen har redan definierats och finns i biblioteket. För att kunna använda vektorklassen måste en programmerare inkludera vektorhuvudet i filen med följande förbehandlingsdirektiv:

#omfatta

När rubriken väl har inkluderats blir alla vektorfunktioner (dataledamöter och medlemsfunktioner) tillgängliga. För att använda räkningsobjektet för att mata ut data till terminalen (konsolen) måste objekthuvudet också inkluderas. Följande rubriker måste inkluderas för att skriva ett program med vektorn som ett minimum:

#omfatta
#omfatta

Instantiera en vektor

intfoo[10];

Ovan är deklarationen av en array med namnet foo och antalet element 10. Detta är en array med heltal. Deklarationen av en vektor är liknande. För en vektor är antalet element valfritt, eftersom vektorlängden kan öka eller minska.

Vid denna tidpunkt i programmet har vektorklassen redan definierats i biblioteket och rubriken har inkluderats. Vektorn kan instantieras enligt följande:

timmar::vektor <int>vtr(8);

Här är vektorn av den speciella konstruktörsfunktionen. Den typ av data som vektorn kommer att hålla är int, i vinkelparenteser. Termen vtr är namnet valt av programmeraren för vektorn. Slutligen är 8, inom parentes, det preliminära antalet heltal som vektorn kommer att ha.

Termen std står för standard namnrymd. Denna term måste följas av en dubbel kolon, i detta sammanhang. Vem som helst kan skriva sitt eget vektorklassbibliotek och använda det. C ++ har dock redan ett standardbibliotek med standardnamn, inklusive vektor. För att använda ett standardnamn måste standardnamnet föregås av std ::. För att undvika att skriva std :: varje gång i programmet för ett standardnamn kan programfilen starta enligt följande:

#omfatta
#omfatta
med namnutrymme std;

Överbelastning av en funktion

När två eller flera olika funktionssignaturer har samma namn sägs det namnet vara överbelastat. När en funktion anropas avgör antalet och typen av argument vilken funktion som körs.

Konstruera en vektor

Att konstruera en vektor innebär att instantiera (skapa) ett vektorobjekt. Konstruktörfunktionen är överbelastad enligt följande:

vektornamn

Detta skapar en vektor med längden noll och typ T. Följande sats skapar en vektor med nollängd av typen float med namnet vtr:

vektor<flyta>vtr;

vektornamn (n)

Detta skapar en vektor med n element av typ T. Ett uttalande för denna vektor med fyra flottörelement är följande:

vektor<flyta>vtr(4);

vektornamn (n, t)

Detta skapar en vektor av n element som initieras till värdet t. Följande sats skapar en vektor med 5 element, där varje element har värdet 3,4:

vektor<flyta>vtr(5, 3.4);

Konstruerar med initialisering

En vektor kan konstrueras (skapas) och initieras samtidigt på ett av följande två sätt:

vektor<flyta>vtr= {1.1, 2.2, 3.3, 4.4};

Eller

vektor<flyta>vtr{1.1, 2.2, 3.3, 4.4};

Observera att det inte finns några parenteser strax efter objektnamnet. Parenteser som används strax efter objektnamnet ska ha initialiseringslistan enligt följande:

vektor<flyta>vtr({1.1, 2.2, 3.3, 4.4});

En vektor kan konstrueras och initieras senare med initialiseringslistan. I detta fall kommer parenteserna inte att användas:

vektor<flyta>vtr;
vtr= {1.1, 2.2, 3.3, 4.4};

vektor V2 (V1)

Detta är en kopia konstruktör. Det skapar en vektor V2 som en kopia av vektorn V1. Följande kod illustrerar detta:

vektor<flyta>vtr1(5, 3.4);
vektor<flyta>vtr2(vtr1);

Tilldela en vektor under konstruktion

Under konstruktionen kan en tom vektor skapas medan en annan tilldelas den enligt följande:

vektor<flyta>vtr1{1.1, 2.2, 3.3, 4.4};
vektor<flyta>vtr2=vtr1;

Det andra uttalandet motsvarar:

vektor<flyta>vtr2= {1.1, 2.2, 3.3, 4.4};

const Vector

En const -vektor är en vektor vars element inte kan ändras. Värdena i denna vektor är skrivskyddade. När den skapas visas vektorn enligt följande:

konstvektor<flyta>vtr{1.1, 2.2, 3.3, 4.4};

I denna vektortyp kan inget element läggas till eller tas bort. Dessutom kan inget värde ändras.

Konstruerar med Iterator

En mall ger en generisk representation för en datatyp. En iterator tillhandahåller en generisk representation av skanning genom värdena för en behållare. Syntaxen för att skapa en vektor med en iterator är följande:

mall<klass InputIterator>
vektor(InputIterator först,InputIterator senast,konstTilldelare& =Tilldelare());

Detta konstruerar en vektor för intervallet [första, sista) med den angivna allokatorn, som kommer att diskuteras senare i denna artikel.

Förstör en vektor

För att förstöra en vektor, låt den helt enkelt gå utanför räckvidden och förstör hanteras automatiskt.

Vektorkapacitet

size_type kapacitet () const noexcept

Det totala antalet element som vektorn kan hålla utan att behöva omfördelas returneras av funktionen kapacitetsmedlem. Ett kodsegment för detta är följande:

vektor<flyta>vtr(4);
intpå ett=vtr.kapacitet();
kosta<<på ett<< ' n';

Utgången är 4.

reserv (n)

Minnesutrymme är inte alltid fritt tillgängligt. Extra plats kan bokas i förväg. Tänk på följande kodsegment:

vektor<flyta>vtr(4);
vtr.boka(6);
kosta<<vtr.kapacitet() << ' n';

Utgången är 6. Så det extra reserverade utrymmet är 6 - 4 = 2 element. Funktionen returnerar ogiltig.

storlek () const noexcept

Detta returnerar antalet element i vektorn. Följande kod illustrerar denna funktion:

vektor<flyta>vtr(4);
flytas=vtr.storlek();
kosta<<s<< ' n';

Utgången är 4.

krymp för att passa()

Efter att ha gett extra kapacitet till en vektor med reserven () -funktionen kan vektorn anpassas till sin ursprungliga storlek. Följande kod illustrerar detta:

vektor<flyta>vtr(4);
vtr.boka(6);
vtr.krymp för att passa();
ints=vtr.storlek();
kosta<<s<< ' n';

Utgången är 4 och inte 6. Funktionen returnerar ogiltigt.

ändra storlek (sz), resize (sz, c)

Detta ändrar storleken på vektorn. Om den nya storleken är mindre än den gamla, raderas elementen mot slutet. Om den nya storleken är längre, läggs något standardvärde till mot slutet. För att få ett visst mervärde, använd funktionen resize () med två argument. Följande kodsegment illustrerar användningen av dessa två funktioner:

vektor<flyta>vtr1{1.1, 2.2, 3.3, 4.4};
vtr1.ändra storlek(2);
kosta<< 'Ny storlek på vtr1:' <<vtr1.storlek() << ' n';
vektor<flyta>vtr2{1.1, 2.2};
vtr2.ändra storlek(4, 8.8);
kosta<< 'vtr2:'<<vtr2[0] <<''<<vtr2[1] <<'
'
<<vtr2[2] <<''<<vtr2[3] << ' n';

Utdata är följande:

Ny storlek på vtr1: 2
vtr2: 1,1 2,2 8,8 8,8

Funktionerna returnerar ogiltiga.

tom () const noexcept

Denna funktion returnerar 1 för true om det inte finns några element i vektorn och 0 för falskt om vektorn är tom. Om en vektor har 4 platser för en viss typ av data, till exempel float, utan något float -värde, är den vektorn inte tom. Följande kod illustrerar detta:

vektor<flyta>vtr;
kosta<<vtr.tömma() << ' n';
vektor<flyta>vt(4);
kosta<<så atttömma() << ' n';

vektor<flyta>v(4,3.5);
kosta<<v.tömma() << ' n';

Utdata är följande:

1
0
0

Vektorelementåtkomst

En vektor kan vara underskriptad (indexerad) som en array. Indexräkning börjar från noll.

vectorName [i]

Operationsvektornamn [i] returnerar en referens till elementet vid ithindex för vektorn. Följande kodutgångar 3.3 för ovanstående vektor:

vektor<flyta>vtr{1.1, 2.2, 3.3, 4.4};
flytafl=vtr[2];
kosta<<fl<< ' n';

vectorName [i] konst

Operationsvektornamn [i] const körs istället för vektornamn [i] när vektorn är en konstant vektor. Denna åtgärd används i följande kod:

konstvektor<flyta>vtr{1.1, 2.2, 3.3, 4.4};
flytafl=vtr[2];
kosta<<fl<< ' n';

Uttrycket returnerar en konstant referens till ithelement i vektorn.

Tilldela ett värde med prenumeration

Ett värde kan tilldelas en icke-konstant vektor enligt följande:

vektor<flyta>vtr{1.1, 2.2, 3.3, 4.4};
vtr[2] = 8.8;
kosta<<vtr[2] << ' n';

Utgången är 8,8.

vectorName.at (i)

vectorName.at (i) är som vectorName [i], men vectorName.at (i) är mer pålitlig. Följande kod visar hur denna vektor ska användas:

vektor<flyta>vtr{1.1, 2.2, 3.3, 4.4};
flytafl=vtr.(2);
kosta<<fl<< ' n';
()är en vektormedlemfungera.

vectorName.at (i) konst

vectorName.at (i) const är som vectorName [i] const, men vectorName.at (i) const är mer pålitlig. vectorName.at (i) const körs istället för vectorName.at (i) när vektorn är en konstant vektor. Denna vektor används i följande kod:

konstvektor<flyta>vtr{1.1, 2.2, 3.3, 4.4};
flytafl=vtr.(2);
kosta<<fl<< ' n';
() konstär en vektormedlemfungera.

Tilldela ett värde med funktionen at ()

Ett värde kan tilldelas en icke-konstant vektor med funktionen at () enligt följande:

vektor<flyta>vtr{1.1, 2.2, 3.3, 4.4};
vtr.(2) = 8.8;
kosta<<vtr[2] << ' n';

Utgången är 8,8.

Problem med sub-scripting

Problemet med sub-scripting (indexering) är att om indexet ligger utanför intervallet kan noll returneras eller ett fel kan utfärdas vid körning.

främre()

Detta returnerar en referens till det första elementet i vektorn utan att elementet tas bort. Utmatningen av följande kod är 1.1.

vektor<flyta>vtr{1.1, 2.2, 3.3, 4.4};
flytafl=vtr.främre();
kosta<<fl<< ' n';

Elementet tas inte bort från vektorn.

fram () konst

När vektorkonstruktionen föregås av const, utförs uttrycket front () const istället för front (). Detta används i följande kod:

konstvektor<flyta>vtr{1.1, 2.2, 3.3, 4.4};
flytafl=vtr.främre();
kosta<<fl<< ' n';

En konstant referens returneras. Elementet tas inte bort från vektorn.

tillbaka()

Detta returnerar en referens till det sista elementet i vektorn utan att ta bort elementet. Utmatningen av följande kod är 4.4.

vektor<flyta>vtr{1.1, 2.2, 3.3, 4.4};
flytafl=vtr.tillbaka();
kosta<<fl<< ' n';

tillbaka () konst

När vektorkonstruktionen föregås av const körs uttrycket back () const istället för back (). Detta används i följande kod:

konstvektor<flyta>vtr{1.1, 2.2, 3.3, 4.4};
flytafl=vtr.tillbaka();
kosta<<fl<< ' n';

En konstant referens returneras. Elementet tas inte bort från vektorn.

Vektordataåtkomst

data () noexcept; data () const noexcept;

Endera av dessa returnerar en pekare så att [data (), data () + storlek ()) är ett giltigt intervall.

Detta kommer att täckas mer i detalj senare i artikeln.

Återkommande Iteratorer och vektorn

En iterator är som en pekare men har mer funktionalitet än en pekare.

begin () noexcept

Returnerar en iterator som pekar på det första elementet i vektorn, som i följande kodsegment:

vektor<flyta>vtr{1.1, 2.2, 3.3, 4.4};
vektor<flyta> ::iteratoriter=vtr.Börja();
kosta<< *iter<< ' n';

Utgången är 1,1. Observera att deklarationen som mottar iteratorn har deklarerats. Iteratorn avfärdas i ett returuttryck för att erhålla värdet på samma sätt som en pekare avskiljs.

begin () const noexcept;

Returnerar en iterator som pekar på det första elementet i vektorn. När vektorkonstruktionen föregås av const, körs uttrycket begin () const istället för begin (). Under detta villkor kan motsvarande element i vektorn inte modifieras. Detta används i följande kod:

konstvektor<flyta>vtr{1.1, 2.2, 3.3, 4.4};
vektor<flyta> ::const_iteratoriter=vtr.Börja();
kosta<< *iter<< ' n';

Utgången är 1,1. Observera att const_iterator har använts denna gång istället för bara iterator för att ta emot den returnerade iteratorn.

slutet () någotxcept

Returnerar en iterator som pekar omedelbart bortom det sista elementet i vektorn. Tänk på följande kodsegment:

vektor<flyta>vtr{1.1, 2.2, 3.3, 4.4};
vektor<flyta> ::iteratoriter=vtr.slutet();
kosta<< *iter<< ' n';

Utgången är 0, vilket är meningslöst, eftersom det inte finns något konkret element utöver det sista elementet.

slut () const noexcept

Returnerar en iterator som pekar omedelbart bortom det sista elementet i vektorn. När vektorkonstruktionen föregås av const körs uttrycket end () const istället för end (). Tänk på följande kodsegment:

konstvektor<flyta>vtr{1.1, 2.2, 3.3, 4.4};
vektor<flyta> ::const_iteratoriter=vtr.slutet();
kosta<< *iter<< ' n';

Utsignalen är 0. Observera att const_iterator har använts denna gång istället för bara iterator för att ta emot den returnerade iteratorn.

Omvänd Iteration

Det är möjligt att ha en iterator som itererar från slutet till strax före det första elementet.

rbegin () noexcept

Returnerar en iterator som pekar på det sista elementet i vektorn, som i följande kodsegment:

vektor<flyta>vtr{1.1, 2.2, 3.3, 4.4};
vektor<flyta> ::reverse_iteratorrIter=vtr.börjar igen();
kosta<< *rIter<< ' n';

Utgången är 4,4.

Observera att deklarationen som mottar omvänd iterator har deklarerats. Iteratorn avfärdas i ett returuttryck för att erhålla värdet på samma sätt som en pekare avskiljs.

rbegin () const noexcept;

Returnerar en iterator som pekar på det sista elementet i vektorn. När vektorkonstruktionen föregås av const körs uttrycket rbegin () const istället för rbegin (). Under detta villkor kan motsvarande element i vektorn inte modifieras. Denna funktion används i följande kod:

konstvektor<flyta>vtr{1.1, 2.2, 3.3, 4.4};
vektor<flyta> ::const_reverse_iteratorrIter=vtr.börjar igen();
kosta<< *rIter<< ' n';

Utgången är 4,4.

Observera att const_reverse_iterator har använts denna gång, istället för bara reverse_iterator, för att ta emot den returnerade iteratorn.

render () noexcept

Returnerar en iterator som pekar strax före det första elementet i vektorn. Tänk på följande kodsegment:

vektor<flyta>vtr{1.1, 2.2, 3.3, 4.4};
vektor<flyta> ::reverse_iteratorrIter=vtr.gör();
kosta<< *rIter<< ' n';

Utgången är 0, vilket är meningslöst, eftersom det inte finns något konkret element strax före det första elementet.

render () const noexcept

Returnerar en iterator som pekar strax före det första elementet i vektorn. När vektorkonstruktionen föregås av const, körs uttrycket rend () const istället för rend (). Tänk på följande kodsegment:

konstvektor<flyta>vtr{1.1, 2.2, 3.3, 4.4};
vektor<flyta> ::const_reverse_iteratorrIter=vtr.gör();
kosta<< *rIter<< ' n';

Utgången är 0.

Observera att const_reverse_iterator har använts denna gång, istället för bara reverse_iterator, för att ta emot den returnerade iteratorn.

Vektor modifierare

En modifierare som modifierar vektorn kan ta eller returnera en iterator.

a. modell (p, args)

Infogar ett objekt av typ T konstruerat med std :: forward (args) ... före sid.

För mer information - se senare

insert (iteratorPosition, värde)

Infogar en kopia av värdet vid vektorn iteratorposition. Returnerar iteratorn (position) i vektorn där kopian har placerats. Följande kod visar var värdet har placerats:

vektor<int>vtr{10, tjugo, 30, 40};
vektor<int> ::iteratoriter=vtr.Börja();
++iter;
++iter;
vtr.Föra in(iter, 25);
kosta<<vtr[1] << '' <<vtr[2]<< '
'
<<vtr[3] << ' n';

Utgången är: 20 25 30.

Observera att iteratorn var avancerad (ökad) precis som en pekare.

En initieringslista kan också infogas, som följande kod illustrerar:

vektor<int>vtr{10, tjugo, 30, 40};
vektor<int> ::iteratoriter=vtr.Börja();
++iter;
++iter;
vtr.Föra in(iter, {25, 28});

kosta<<vtr[1] << '' <<vtr[2]<< '
'
<<vtr[3]<< '' <<vtr[4] << ' n';

Utgången är: 20 25 28 30.

radera (position)

Tar bort ett element vid den position som iteratorn pekar på och returnerar sedan iteratorpositionen. Följande kod illustrerar detta:

vektor<int>vtr{10, tjugo, 30, 40};
vektor<int> ::iteratoriter=vtr.Börja();
++iter;
++iter;
vtr.radera(iter);
kosta<<vtr[0] << '' <<vtr[1] << '
'
<<vtr[2]<< ' n';

Utgången är: 10 20 40

push_back (t), push_back (rv)

Används för att lägga till ett enda element i slutet av vektorn. Använd push_back (t) enligt följande:

vektor<flyta>vtr{1.1, 2.2, 3.3, 4.4};
vtr.trycka tillbaka(5.5);
flytafl=vtr[4];
kosta<<fl<< ' n';

Utgången är 5,5.

trycka tillbaka(rv): -ses senare.

pop_back ()

Tar bort det sista elementet utan att returnera det. Storleken på vektorn reduceras med 1. Följande kod illustrerar detta:

vektor<flyta>vtr{1.1, 2.2, 3.3, 4.4};
vtr.pop_back();
flytas=vtr.storlek();
kosta<<s<< ' n';

Utgången är 3.

a. byta (b)

Två vektorer kan bytas, som illustreras i följande kodsegment:

vektor<flyta>vtr1{1.1, 2.2, 3.3, 4.4};
vektor<flyta>vtr2{10, tjugo};
vtr1.byta(vtr2);
kosta<< 'vtr1:'<<vtr1[0] <<''<<vtr1[1] <<'
'
<<vtr1[2] <<''<<vtr1[3] << ' n';

kosta<< 'vtr2:'<<vtr2[0] <<''<<vtr2[1] <<'
'
<<vtr2[2] <<''<<vtr2[3] << ' n';

Utgången är:

vtr1: 10 tjugo 0 0
vtr2: 1.1 2.2 3.3 4.4

Observera att längden på en vektor ökar vid behov. Värden som inte hade ersättningar ersätts också av något standardvärde.

klar()

Tar bort alla element från vektorn, som följande kodsegment illustrerar:

vektor<flyta>vtr{1.1, 2.2, 3.3, 4.4};
vtr.klar();
kosta<<vtr.storlek() << ' n';

Utgången är 0.

Jämställdhets- och relationsoperatörer för vektorer

Operatören ==

Returnerar 1 för true om de två vektorerna har samma storlek och motsvarande element är lika; annars returnerar den 0 för falskt. Till exempel:

vektor<int>U{1, 2, 3};
vektor<int>V{4, 5, 6};
bool bl=U==V;
kosta<<bl<< ' n';

Utgången är 0.

! = Operatören

Returnerar 1 för true om de två vektorerna inte har samma storlek och/eller motsvarande element inte är lika; annars returnerar den 0 för falskt. Till exempel:

vektor<int>U{1, 2, 3};
vektor<int>V{4, 5, 6};
bool bl=U! =V;
kosta<<bl<< ' n';

Utgången är 1.

De

Returnerar 1 för true om den första vektorn är den första delmängden av den andra vektorn, med elementen i de två lika stora delarna samma och i samma ordning. Om båda vektorerna är av samma storlek och rör sig från vänster till höger och ett element påträffas i den första vektorn som är mindre än motsvarande element i den andra vektorn, kommer 1 fortfarande att returneras. Annars returneras 0 för false. Till exempel:

vektor<int>U{3, 1, 1};
vektor<int>V{3, 2, 1};
bool bl=U<V;
kosta<<bl<< ' n';

Utgången är 1.

> Operatören

Återkommer! (U

De<= Operator

Returnerar U<= V, where U is the first vector and V is the second vector, according to the above definitions.

> = Operatören

Återkommer! (U<= V), where U is the first vector and V is the second vector, according to the above definitions.

Slutsats

En vektor är ett exempel på en sekvensbehållare. En vektor är en bättre form av den vanliga matrisen och är instanserad från en klass. Vektorer har metoder som klassificeras under: konstruktion och tilldelning, kapacitet, elementåtkomst, dataåtkomst, iteratorer, modifierare och numeriskt överbelastade operatörer.

Det finns andra sekvensbehållare, kallade list, forward_list och array. Om uppgiften innefattar frekventa infogningar och raderingar i mitten av sekvensen, bör en lista eller forward_list användas. Om uppgiften innefattar frekventa infogningar och raderingar i början eller slutet av sekvensen, bör en deque användas. Och så bör vektorer endast användas när denna typ av operationer inte är viktiga.