Hvordan bruke C ++ vektor

Hvordan bruke C ++ vektor
En matrise er en serie med samme objekttyper i påfølgende minneplasser. En matrise kan ikke øke malm redusere lengden. En vektor er som en matrise, men lengden kan økes eller reduseres. En vektor har derfor mange flere operasjoner enn en matrise. C ++ har mange biblioteker, som alle danner C ++ standardbiblioteket. Et av disse bibliotekene er containerbiblioteket. En beholder er en samling av objekter, og visse operasjoner kan utføres på samlingen. C ++ containere kan grupperes i to sett: sekvensbeholdere og assosiative beholdere. Sekvensbeholdere er vektor, matrise (ikke den samme arrayen som er diskutert tidligere), deque, forward_list og liste. Dette er forskjellige samlinger (matrise-lignende datastrukturer), og hver tilbyr distinkte avveininger. Enhver programmerer skal vite hvordan man skal bestemme om de skal bruke en vektor, en matrise, en deque, en fremover_liste eller en liste. Når en programmerer trenger en struktur som krever mer operasjoner enn de som er assosiert med en vanlig matrise, skal ikke den vanlige matrisen brukes. Hvis oppgaven innebærer hyppige innsettinger og slettinger midt i sekvensen, bør en liste eller fremover_liste brukes. Hvis oppgaven innebærer hyppige innsettinger og slettinger i begynnelsen eller slutten av en sekvens, bør en deque brukes. En vektor skal brukes når denne typen operasjoner ikke er påkrevd. Denne artikkelen viser deg hvordan du bruker C ++ -vektoren. Du trenger litt kunnskap om C ++ pekere, referanser og matriser for å forstå denne artikkelen.

Klasse og gjenstander

En klasse er et sett med variabler og funksjoner som fungerer sammen, der variablene ikke har verdsatte verdier. Når verdier er tilordnet variablene, blir en klasse et objekt. Ulike verdier gitt til samme klasse resulterer i forskjellige objekter; det vil si at forskjellige objekter kan være av samme klasse, men har forskjellige verdier. Å opprette et objekt fra en klasse er også kjent som å instantisere objektet.

Begrepet vektor beskriver en klasse. Et objekt opprettet fra en vektor har et navn som er valgt av programmereren.

En funksjon som tilhører en klasse er nødvendig for å instantisere et objekt fra klassen. I C ++ har den funksjonen samme navn som navnet på klassen. Ulike objekter opprettet (instantiert) fra klassen har tydelige navn gitt til hver av dem av programmereren.

Å lage et objekt fra en klasse betyr å konstruere objektet; Det betyr også å instantisere objektet.

Vektorklassen

Vektorklassen er allerede definert og er i biblioteket. For å bruke vektorklassen, må en programmerer inkludere vektoroverskriften i filen med følgende forbehandlingsdirektiv:

#inkludere

Når overskriften er inkludert, blir alle vektorfunksjonene (datamedlemmer og medlemsfunksjoner) tilgjengelige. For å bruke telleobjektet til å sende ut data til terminalen (konsollen), må også objektoverskriften være inkludert. For å skrive et program med vektoren, som et minimum, må følgende overskrifter inkluderes:

#inkludere
#inkludere

Instortering av en vektor

int foo [10];

Over er erklæringen om en matrise med navnet “Foo” og antall elementer “10.”Dette er en rekke heltall. Erklæringen om en vektor er lik. For en vektor er antall elementer valgfritt, siden vektorklengden kan øke eller redusere.

På dette tidspunktet i programmet har vektorklassen allerede blitt definert i biblioteket, og overskriften er inkludert. Vektoren kan instantieres som følger:

std :: vektor VTR (8);

Her er vektoren av den spesielle konstruktørfunksjonen. Hvilken type data vektoren vil inneholde er "int" i vinkelfester. Begrepet “VTR” er navnet valgt av programmereren for vektoren. Til slutt, "8", i parenteser, er det tentative antallet heltall vektoren vil ha.

Begrepet “STD” står for standard navneområde. Dette begrepet må følges av en dobbel kolon, i denne sammenhengen. Hvem som helst kan skrive sitt eget vektorklassebibliotek og bruke det. Imidlertid har C ++ allerede et standardbibliotek med standardnavn, inkludert “Vector.”For å bruke et standardnavn, må standardnavnet inngås av STD :: . For å unngå å skrive std :: Hver gang i programmet for et standardnavn, kan programfilen starte som følger:

#inkludere
#inkludere
ved hjelp av navneområdet STD;

Overbelastning av en funksjon

Når to eller flere forskjellige funksjonssignaturer har samme navn, sies det navnet å være overbelastet. Når en funksjon kalles, bestemmer antallet og typen argumenter hvilken funksjon som utføres.

Konstruere en vektor

Å konstruere en vektor betyr å instruentere (skape) et vektorobjekt. Konstruktørfunksjonen er overbelastet som følger:

Vektornavn

Dette skaper en vektor med lengde null og type “t.”Følgende uttalelse oppretter en vektor med null lengde på typen“ float ”med navnet“ VTR: ”

vektor VTR;

Vektornavn (N)

Dette skaper en vektor med n elementer av type “t.”En uttalelse for denne vektoren med fire floatelementer er som følger:

vektor VTR (4);

Vektornavn (N, T)

Dette skaper en vektor av n elementer som er initialisert til verdien t. Følgende uttalelse oppretter en vektor på 5 elementer, der hvert element har verdien 3.4:

vektor VTR (5, 3.4);

Konstruere med initialisering

En vektor kan konstrueres (opprettes) og initialiseres samtidig, på en av de følgende to måtene:

vektor VTR = 1.1, 2.2, 3.3, 4.4;

Eller

vektor VTR 1.1, 2.2, 3.3, 4.4;

Merk at det ikke er noen parenteser like etter objektnavnet. Parenteser som brukes rett etter at objektnavnet skal ha initialiseringslisten, som følger:

vektor VTR (1.1, 2.2, 3.3, 4.4);

En vektor kan konstrueres og initialiseres senere med initialisatorlisten. I dette tilfellet vil ikke parentesene bli brukt:

vektor VTR;
VTR = 1.1, 2.2, 3.3, 4.4;

vektor v2 (v1)

Dette er en kopikonstruktør. Det skaper en vektor v2 som en kopi av vektoren V1. Følgende kode illustrerer dette:

vektor VTR1 (5, 3.4);
vektor VTR2 (VTR1);

Tilordne en vektor under konstruksjonen

Under konstruksjonen kan en tom vektor opprettes mens en annen blir tildelt den, som følger:

vektor VTR1 1.1, 2.2, 3.3, 4.4;
vektor VTR2 = VTR1;

Den andre uttalelsen tilsvarer:

vektor VTR2 = 1.1, 2.2, 3.3, 4.4;

const vektor

En Const -vektor er en vektor hvis elementer ikke kan endres. Verdiene i denne vektoren er skrivebeskyttet. Når den opprettes, vises vektoren som følger:

const vektor VTR 1.1, 2.2, 3.3, 4.4;

I denne vektortypen kan ikke noe element legges til eller fjernes. Dessuten kan ingen verdi endres.

Konstruere med iterator

En mal gir en generisk representasjon for en datatype. En iterator gir en generisk representasjon av skanning gjennom verdiene til en beholder. Syntaksen for å lage en vektor med en iterator er som følger:

mal
vektor (inputIterator først, inputiterator sist, const allocator & = allocator ());

Dette konstruerer en vektor for området [først, sist) ved hjelp av den spesifiserte allokatoren, som vil bli diskutert senere i denne artikkelen.

Ødelegger en vektor

For å ødelegge en vektor, kan du bare la den gå ut av omfang og ødeleggelse håndteres automatisk.

Vektorkapasitet

størrelse_type kapasitet () const noExcept

Det totale antall elementer Vektoren kan holde uten å kreve omfordeling returneres av kapasitetsmedlemfunksjonen. Et kodesegment for dette er som følger:

vektor VTR (4);
int num = VTR.kapasitet();
cout << num << '\n';

Utgangen er 4.

reserve (n)

Minneområdet er ikke alltid fritt tilgjengelig. Ekstra plass kan reserveres på forhånd. Tenk på følgende kodesegment:

vektor VTR (4);
VTR.reserve (6);
cout << vtr.capacity() << '\n';

Utgangen er 6. Så den ekstra plassen som er reservert er 6 - 4 = 2 elementer. Funksjonen returnerer tomrom.

størrelse () const nowexcept

Dette returnerer antall elementer i vektoren. Følgende kode illustrerer denne funksjonen:

vektor VTR (4);
Float Sz = VTR.størrelse();
cout << sz << '\n';

Utgangen er 4.

krymp for å passe()

Etter å ha gitt ekstra kapasitet til en vektor med reserve () -funksjonen, kan vektoren dimensjoneres for å passe til sin opprinnelige størrelse. Følgende kode illustrerer dette:

vektor VTR (4);
VTR.reserve (6);
VTR.krymp for å passe();
int sz = VTR.størrelse();
cout << sz << '\n';

Utgangen er 4 og ikke 6. Funksjonen returnerer tomrom.

Størrelse (SZ), Endre størrelse (SZ, C)

Dette endrer størrelsen på vektoren. Hvis den nye størrelsen er mindre enn den gamle størrelsen, blir elementene mot slutten slettet. Hvis den nye størrelsen er lengre, blir det lagt til en viss standardverdi mot slutten. For å ha en bestemt verdiøkning, bruk Endre størrelse () -funksjonen med to argumenter. Følgende kodesegment illustrerer bruken av disse to funksjonene:

vektor VTR1 1.1, 2.2, 3.3, 4.4;
VTR1.endre størrelse (2);
cout << "New size of vtr1: " << vtr1.size() << '\n';
vektor VTR2 1.1, 2.2;
VTR2.Endre størrelse (4, 8.8);
cout << "vtr2: "<< vtr2[0] <<" "<< vtr2[1] <<"
""<< vtr2[2] <<" "<< vtr2[3] << '\n';

Utgangen er følgende:

Ny størrelse på VTR1: 2
VTR2: 1.1 2.2 8.8 8.8

Funksjonene returnerer tomrom.

tomt () const nowexcept

Denne funksjonen returnerer 1 for sann hvis det ikke er noen elementer i vektoren og 0 for usant hvis vektoren er tom. Hvis en vektor har 4 lokasjoner for en bestemt type data, for eksempel float, uten noen flyteverdi, er den vektoren ikke tom. Følgende kode illustrerer dette:

vektor VTR;
cout << vtr.empty() << '\n';
vektor VT (4);
cout << vt.empty() << '\n';
vektor V (4,3.5);
cout << v.empty() << '\n';

Utgangen er følgende:

1
0
0

Vektorelementtilgang

En vektor kan være underskrevet (indeksert) som en matrise. Indekstelling begynner fra null.

Vectorname [i]

Operasjonen “Vectorname [i]” returnerer en referanse til elementet på ith indeks for vektoren. Følgende kodeutganger 3.3 for ovennevnte vektor:

vektor VTR 1.1, 2.2, 3.3, 4.4;
float fl = vtr [2];
cout << fl << '\n';

Vectorname [i] const

Operasjonen “Vectorname [i] const” utføres i stedet for “Vectorname [i]” når vektoren er en konstant vektor. Denne operasjonen brukes i følgende kode:

const vektor VTR 1.1, 2.2, 3.3, 4.4;
float fl = vtr [2];
cout << fl << '\n';

Uttrykket returnerer en konstant referanse til ith elementet i vektoren.

Tilordne en verdi med abonnement

En verdi kan tilordnes en ikke-konstant vektor, som følger:

vektor VTR 1.1, 2.2, 3.3, 4.4;
VTR [2] = 8.8;
cout << vtr[2] << '\n';

Utgangen er 8.8.

Vectorname.på (i)

“Vectorname.på (i) "er som" Vectorname [i] ", men" Vectorname.på (i) ”er mer pålitelig. Følgende kode viser hvordan denne vektoren skal brukes:

vektor VTR 1.1, 2.2, 3.3, 4.4;
FLOAT FL = VTR.på (2);
cout << fl << '\n';
at () er en vektormedlemsfunksjon.

Vectorname.på (i) const

“Vectorname.på (i) const ”er som“ Vectorname [i] const ”, men“ Vectorname.på (i) const ”er mer pålitelig. “Vectorname.ved (i) const "utføres i stedet for“ Vectorname.ved (i) ”når vektoren er en konstant vektor. Denne vektoren brukes i følgende kode:

const vektor VTR 1.1, 2.2, 3.3, 4.4;
FLOAT FL = VTR.på (2);
cout << fl << '\n';
at () const er en vektormedlemsfunksjon.

Tilordne en verdi med at () -funksjonen

En verdi kan tilordnes en ikke-konstant vektor med AT () -funksjonen, som følger:

vektor VTR 1.1, 2.2, 3.3, 4.4;
VTR.på (2) = 8.8;
cout << vtr[2] << '\n';

Utgangen er 8.8.

Problem med delskrifing

Problemet med delskrifing (indeksering) er at hvis indeksen er utenfor rekkevidde, kan null returneres eller en feil kan utstedes ved kjøretid.

front()

Dette returnerer en referanse til det første elementet i vektoren uten å fjerne elementet. Utgangen til følgende kode er 1.1.

vektor VTR 1.1, 2.2, 3.3, 4.4;
FLOAT FL = VTR.front();
cout << fl << '\n';

Elementet fjernes ikke fra vektoren.

front () const

Når vektorkonstruksjonen er gitt av Const, blir uttrykket “front () const” utført i stedet for “foran ().”Dette brukes i følgende kode:

const vektor VTR 1.1, 2.2, 3.3, 4.4;
FLOAT FL = VTR.front();
cout << fl << '\n';

En konstant referanse returneres. Elementet fjernes ikke fra vektoren.

tilbake()

Dette returnerer en referanse til det siste elementet i vektoren uten å fjerne elementet. Utgangen til følgende kode er 4.4.

vektor VTR 1.1, 2.2, 3.3, 4.4;
FLOAT FL = VTR.tilbake();
cout << fl << '\n';

Tilbake () const

Når vektorkonstruksjonen er gitt av Const, utføres uttrykket “back () const” i stedet for “Back ().”Dette brukes i følgende kode:

const vektor VTR 1.1, 2.2, 3.3, 4.4;
FLOAT FL = VTR.tilbake();
cout << fl << '\n';

En konstant referanse returneres. Elementet fjernes ikke fra vektoren.

Vektortatatilgang

Data () NOExcept; data () const noExcept;

En av disse returnerer en peker slik at [data (), data () + størrelse ()) er et gyldig område.

Dette vil bli dekket nærmere senere i artikkelen.

Returnerer iteratorer og vektoren

En iterator er som en peker, men har mer funksjonalitet enn en peker.

Begynn () NOEXCEPT

Returnerer en iterator som peker på det første elementet i vektoren, som i følgende kodesegment:

vektor VTR 1.1, 2.2, 3.3, 4.4;
vektor:: iterator iter = VTR.begynne();
cout << *iter << '\n';

Utgangen er 1.1. Merk at erklæringen som mottar iteratoren er erklært. Iteratoren er derferert i et returuttrykk for å oppnå verdien på samme måte som en peker blir derferert.

Begynn () const noExcept;

Returnerer en iterator som peker på det første elementet i vektoren. Når vektorkonstruksjonen er gitt av Const, utføres uttrykket “begynn () const” i stedet for “Begynn ().”Under denne tilstanden kan det tilsvarende elementet i vektoren ikke endres. Dette brukes i følgende kode:

const vektor VTR 1.1, 2.2, 3.3, 4.4;
vektor:: const_iterator iter = vtr.begynne();
cout << *iter << '\n';

Utgangen er 1.1. Merk at "const_iterator" har blitt brukt denne gangen i stedet for bare "iterator" for å motta den returnerte iteratoren.

slutt () NOEXCEPT

Returnerer en iterator som peker rett utover det siste elementet i vektoren. Tenk på følgende kodesegment:

vektor VTR 1.1, 2.2, 3.3, 4.4;
vektor:: iterator iter = VTR.slutt();
cout << *iter << '\n';

Utgangen er 0, som er meningsløs, ettersom det ikke er noe konkret element utover det siste elementet.

slutt () const nowexcept

Returnerer en iterator som peker rett utover det siste elementet i vektoren. Når vektorkonstruksjonen er forut for "const", blir uttrykket "end () const" utført i stedet for "ende ().”Tenk på følgende kodesegment:

const vektor VTR 1.1, 2.2, 3.3, 4.4;
vektor:: const_iterator iter = vtr.slutt();
cout << *iter << '\n';

Utgangen er 0. Merk at "const_iterator" har blitt brukt denne gangen i stedet for bare "iterator" for å motta den returnerte iteratoren.

Omvendt iterasjon

Det er mulig å ha en iterator som itererer fra slutten til rett før det første elementet.

rbegin () NoExcept

Returnerer en iterator som peker på det siste elementet i vektoren, som i følgende kodesegment:

vektor VTR 1.1, 2.2, 3.3, 4.4;
vektor:: Reverse_Iterator Riter = VTR.rbegin ();
cout << *rIter << '\n';

Utgangen er 4.4.

Merk at erklæringen som mottar den motsatte iteratoren er erklært. Iteratoren er derferert i et returuttrykk for å oppnå verdien på samme måte som en peker blir derferert.

rbegin () const noExcept;

Returnerer en iterator som peker på det siste elementet i vektoren. Når vektorkonstruksjonen er gitt av “const”, blir uttrykket “rbegin () const” utført i stedet for “rbegin ().”Under denne tilstanden kan det tilsvarende elementet i vektoren ikke endres. Denne funksjonen brukes i følgende kode:

const vektor VTR 1.1, 2.2, 3.3, 4.4;
vektor:: const_reverse_iterator riter = VTR.rbegin ();
cout << *rIter << '\n';

Utgangen er 4.4.

Merk at Const_reverse_iterator har blitt brukt denne gangen, i stedet for bare reverse_iterator, for å motta den returnerte iteratoren.

Rend () NoExcept

Returnerer en iterator som peker rett før det første elementet i vektoren. Tenk på følgende kodesegment:

vektor VTR 1.1, 2.2, 3.3, 4.4;
vektor:: Reverse_Iterator Riter = VTR.Rend ();
cout << *rIter << '\n';

Utgangen er 0, som er meningsløs, da det ikke er noe konkret element rett før det første elementet.

Rend () Const NoExcept

Returnerer en iterator som peker rett før det første elementet i vektoren. Når vektorkonstruksjonen er gitt av "const", blir uttrykket “rend () const” utført i stedet for “Rend ().”Tenk på følgende kodesegment:

const vektor VTR 1.1, 2.2, 3.3, 4.4;
vektor:: const_reverse_iterator riter = VTR.Rend ();
cout << *rIter << '\n';

Utgangen er 0.

Merk at Const_reverse_iterator har blitt brukt denne gangen, i stedet for bare reverse_iterator, for å motta den returnerte iteratoren.

Vektormodifiserere

En modifiserer som endrer vektoren kan ta eller returnere en iterator.

en.Emplace (P, Args)

Setter inn et objekt av type T konstruert med std :: fremover (args) ... før P.

For detaljer - se senere

Sett inn (iteratorposisjon, verdi)

Setter inn en kopi av verdien på vektorens iteratorposisjon. Returnerer iteratoren (posisjonen) i vektoren der kopien er plassert. Følgende kode viser hvor verdien er plassert:

vektor VTR 10, 20, 30, 40;
vektor:: iterator iter = VTR.begynne();
++iter;
++iter;
VTR.Sett inn (iter, 25);
cout << vtr[1] << " << vtr[2]<< '
' << vtr[3] << '\n';

Utgangen er: 20 25 30.

Merk at iteratoren var avansert (økt) akkurat som en peker.

En initialiseringsliste kan også settes inn, som følgende kode illustrerer:

vektor VTR 10, 20, 30, 40;
vektor:: iterator iter = VTR.begynne();
++iter;
++iter;
VTR.Sett inn (iter, 25, 28);
cout << vtr[1] << " << vtr[2]<< '
' << vtr[3]<< " << vtr[4] << '\n';

Utgangen er: 20 25 28 30.

Slett (posisjon)

Fjerner et element i stillingen som iteratoren peker på, og returnerer deretter iteratorposisjonen. Følgende kode illustrerer dette:

vektor VTR 10, 20, 30, 40;
vektor:: iterator iter = VTR.begynne();
++iter;
++iter;
VTR.slette (iter);
cout << vtr[0] << " << vtr[1] << '
' << vtr[2]<< '\n';

Utgangen er: 10 20 40

push_back (t), push_back (RV)

Brukes til å legge til et enkelt element på slutten av vektoren. Bruk push_back (t) som følger:

vektor VTR 1.1, 2.2, 3.3, 4.4;
VTR.Push_back (5.5);
float fl = vtr [4];
cout << fl << '\n';

Utgangen er 5.5.

Push_back (RV): - Se senere.

pop_back ()

Fjerner det siste elementet uten å returnere det. Størrelsen på vektoren reduseres med 1. Følgende kode illustrerer dette:

vektor VTR 1.1, 2.2, 3.3, 4.4;
VTR.pop_back ();
Float Sz = VTR.størrelse();
cout << sz << '\n';

Utgangen er 3.

en.Swap (b)

To vektorer kan byttes, som illustrert i følgende kodesegment:

vektor VTR1 1.1, 2.2, 3.3, 4.4;
vektor VTR2 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';

Utgangen er:

VTR1: 10 20 0 0
VTR2: 1.1 2.2 3.3 4.4

Merk at lengden på en vektor økes om nødvendig. Verdier som ikke hadde erstatning, erstattes av noen standardverdi.

klar()

Fjerner alle elementer fra vektoren, som følgende kodesegment illustrerer:

vektor VTR 1.1, 2.2, 3.3, 4.4;
VTR.klar();
cout << vtr.size() << '\n';

Utgangen er 0.

Likestilling og relasjonelle operatører for vektorer

== operatøren

Returnerer 1 for sann hvis de to vektorene har samme størrelse og de tilsvarende elementene er like; Ellers returnerer det 0 for falsk. For eksempel:

vektor U 1, 2, 3;
vektor V 4, 5, 6;
bool bl = u == v;
cout << bl << '\n';

Utgangen er 0.

De != Operatør

Returnerer 1 for sann hvis de to vektorene ikke har samme størrelse og/eller de tilsvarende elementene ikke er like; Ellers returnerer det 0 for falsk. For eksempel:

vektor U 1, 2, 3;
vektor V 4, 5, 6;
bool bl = u!= V;
cout << bl << '\n';

Utgangen er 1.

De < Operator

Returnerer 1 for sann hvis den første vektoren er den første delmengden av den andre vektoren, med elementene i de to like store delene som er den samme og i samme rekkefølge. Hvis begge vektorene har samme størrelse og beveger seg fra venstre til høyre og et element oppstår i den første vektoren som er mindre enn det tilsvarende elementet i den andre vektoren, vil 1 fortsatt bli returnert. Ellers returneres 0 for falsk. For eksempel:

vektor U 3, 1, 1;
vektor V 3, 2, 1;
bool bl = ucout << bl << '\n';

Utgangen er 1. < does not include the case when the size and order are the same.

> Operatøren

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

De <= Operator

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

> = Operatøren

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

Konklusjon

En vektor er et eksempel på en sekvensbeholder. En vektor er en "bedre" form for den ordinære matrisen og blir instantiert fra en klasse. Vektorer har metoder som er klassifisert under: konstruksjon og tildeling, kapasitet, elementtilgang, datatilgang, iteratorer, modifikatorer og numeriske overbelastede operatører.

Det er andre sekvensbeholdere, kalt liste, fremover_list og matrise. Hvis oppgaven innebærer hyppige innsettinger og slettinger midt i sekvensen, bør en liste eller fremover_liste brukes. Hvis oppgaven innebærer hyppige innsettinger og slettinger i begynnelsen eller slutten av sekvensen, bør en deque brukes. Og så bør vektorer bare brukes når denne typen operasjoner ikke er viktige.