Introduksjon
En matrise er en serie av samme objekttyper i påfølgende minneplasseringer. En matrise kan ikke øke malmens lengde. 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 ++ Standard Library. En av disse bibliotekene er containerbiblioteket. En container er en samling objekter, og visse operasjoner kan utføres på samlingen. C ++ - containere kan grupperes i to sett: sekvensbeholdere og assosierende containere. Sekvensbeholdere er vektor, matrise (ikke den samme matrisen diskutert tidligere), deque, fremoverliste og liste. Dette er forskjellige samlinger (array-lignende datastrukturer), og hver tilbyr forskjellige avveininger.
Enhver programmerer bør vite hvordan de skal bestemme om de skal bruke en vektor, en matrise, en deque, en forward_list eller en liste. Når en programmerer trenger en struktur som krever flere operasjoner enn de som er knyttet til en vanlig matrise, bør den vanlige matrisen ikke brukes.
Hvis oppgaven innebærer hyppige innsettinger og slettinger midt i sekvensen, bør en liste eller fremoverliste brukes. Hvis oppgaven innebærer hyppige innsettinger og slettinger i begynnelsen eller slutten av en sekvens, bør en deque brukes. En vektor bør 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 verdier tildelt. Når verdier tildeles 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 ha forskjellige verdier. Å lage et objekt fra en klasse er også kjent som å instantere objektet.
Begrepet vektor beskriver en klasse. Et objekt opprettet fra en vektor har et navn som velges av programmereren.
En funksjon som tilhører en klasse er nødvendig for å instantiere et objekt fra klassen. I C ++ har den funksjonen samme navn som navnet på klassen. Ulike objekter opprettet (instantiert) fra klassen har forskjellige navn gitt til hver av dem av programmereren.
Å lage et objekt fra en klasse betyr å konstruere objektet; det betyr også å instantiere objektet.
Vektorklassen
Vektorklassen er allerede definert og er i biblioteket. For å bruke vektorklassen, må en programmerer inkludere vektoroverskriften i filen med følgende forhåndsbehandlingsdirektiv:
#inkludereNår toppteksten er inkludert, blir alle vektorfunksjonene (datamedlemmer og medlemsfunksjoner) tilgjengelige. For å bruke telleobjektet til å sende ut data til terminalen (konsoll), må også objektoverskriften være inkludert. For å skrive et program med vektoren, må minst følgende overskrifter være inkludert:
#inkludere#inkludere
Instantiering av en vektor
int foo [10];Ovenfor er erklæringen til en matrise med navnet "foo" og antall elementer "10.”Dette er en rekke heltall. Deklarasjonen av en vektor er lik. For en vektor er antall elementer valgfritt, siden vektorlengden kan øke eller redusere.
På dette punktet i programmet er vektorklassen allerede definert i biblioteket, og overskriften er inkludert. Vektoren kan instantiseres som følger:
std :: vektorHer er vektoren til den spesielle konstruktorfunksjonen. Typen data vektoren vil inneholde er "int", i vinkelparenteser. Uttrykket “vtr” er navnet valgt av programmereren for vektoren. Til slutt er "8", i parentes, det foreløpige antall heltall vektoren vil ha.
Begrepet "std" står for standard navneområde. Dette begrepet må følges av et dobbelt kolon, i denne sammenheng. Hvem som helst kan skrive sitt eget vektorklassebibliotek og bruke det. Imidlertid har C ++ allerede et standardbibliotek med standardnavn, inkludert "vektor.”For å bruke et standardnavn, må standardnavnet være std :: . For å unngå å skrive std :: hver gang i programmet for et standardnavn, kan programfilen starte som følger:
#inkludere#inkludere
bruker navneområde std;
Overbelastning av en funksjon
Når to eller flere forskjellige funksjonssignaturer har samme navn, sies det at navnet er overbelastet. Når en funksjon kalles, bestemmer antall og type argumenter hvilken funksjon som utføres.
Konstruere en vektor
Å konstruere en vektor betyr å starte (lage) et vektorobjekt. Konstruktorfunksjonen er overbelastet som følger:
vektor
Dette skaper en vektor med lengde null og skriver “T."Følgende utsagn oppretter en vektor med null lengde av typen" flyte "med navnet" vtr: "
vektorvektor
Dette skaper en vektor med n elementer av typen “T.”En uttalelse for denne vektoren med fire flyteelementer er som følger:
vektorvektor
Dette skaper en vektor av n elementer initialisert til verdien t. Følgende utsagn oppretter en vektor på 5 elementer, hvor hvert element har verdien 3.4:
vektorKonstruksjon med initialisering
En vektor kan konstrueres (opprettes) og initialiseres samtidig, på en av følgende to måter:
vektorEller
vektorMerk at det ikke er noen parentes like etter objektnavnet. Parenteser som brukes like etter objektnavnet, bør ha initialiseringslisten, som følger:
vektorEn vektor kan konstrueres og initialiseres senere med initialiseringslisten. I dette tilfellet vil ikke parentesene brukes:
vektorvtr = 1.1, 2.2, 3.3, 4.4;
vektor
Dette er en kopikonstruktør. Den lager en vektor V2 som en kopi av vektoren V1. Følgende kode illustrerer dette:
vektorvektor
Tilordne en vektor under konstruksjon
Under konstruksjon kan en tom vektor opprettes mens en annen tilordnes den, som følger:
vektorvektor
Den andre utsagnet tilsvarer:
vektorconst Vector
En const-vektor er en vektor hvis elementer ikke kan endres. Verdiene i denne vektoren er skrivebeskyttet. Når den er opprettet, vises vektoren som følger:
const vektorI denne vektortypen kan ikke noe element legges til eller fjernes. Videre kan ingen verdi endres.
Konstruksjon med Iterator
En mal gir en generell representasjon for en datatype. En iterator gir en generell representasjon av skanning gjennom verdiene til en container. Syntaksen for å lage en vektor med en iterator er som følger:
malvektor (InputIterator først, InputIterator sist, const Allocator & = Allocator ());
Dette konstruerer en vektor for området [første, siste] ved hjelp av den spesifiserte tildeleren, som vil bli diskutert senere i denne artikkelen.
Å ødelegge en vektor
For å ødelegge en vektor, bare la den gå utenfor omfanget og ødelegge håndteres automatisk.
Vektorkapasitet
størrelse_type kapasitet () const noexcept
Det totale antall elementer vektoren kan inneholde uten å kreve omdisponering returneres av kapasitetsmedlemfunksjonen. Et kodesegment for dette er som følger:
vektorint num = vtr.kapasitet();
cout << num << '\n';
Utgangen er 4.
reserve (n)
Minneplass er ikke alltid fritt tilgjengelig. Ekstra plass kan reserveres på forhånd. Vurder følgende kodesegment:
vektorvtr.reserve (6);
cout << vtr.capacity() << '\n';
Utgangen er 6. Så den ekstra reserverte plassen er 6 - 4 = 2 elementer. Funksjonen returnerer ugyldig.
størrelse () const noexcept
Dette returnerer antall elementer i vektoren. Følgende kode illustrerer denne funksjonen:
vektorflyte 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 deles ned for å passe til den opprinnelige størrelsen. Følgende kode illustrerer dette:
vektorvtr.reserve (6);
vtr.krymp for å passe();
int sz = vtr.størrelse();
cout << sz << '\n';
Utgangen er 4 og ikke 6. Funksjonen returnerer ugyldig.
endre 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 noen standardverdier lagt til mot slutten. For å ha en bestemt merverdi, bruk resize () -funksjonen med to argumenter. Følgende kodesegment illustrerer bruken av disse to funksjonene:
vektorvtr1.endre størrelse (2);
cout << "New size of vtr1: " << vtr1.size() << '\n';
vektor
vtr2.endre størrelse (4, 8.8);
cout << "vtr2: "<< vtr2[0] <<" "<< vtr2[1] <<"
"<< vtr2[2] <<" "<< vtr2[3] << '\n';
Resultatet er følgende:
Ny størrelse på vtr1: 2vtr2: 1.1 2.2 8.8 8.8
Funksjonene blir ugyldige.
tom () const noexcept
Denne funksjonen returnerer 1 for true hvis det ikke er noen elementer i vektoren og 0 for false hvis vektoren er tom. Hvis en vektor har fire steder for en bestemt type data, for eksempel float, uten floatverdi, er ikke vektoren tom. Følgende kode illustrerer dette:
vektorcout << vtr.empty() << '\n';
vektor
cout << vt.empty() << '\n';
vektor
cout << v.empty() << '\n';
Resultatet er følgende:
10
0
Vector Element Access
En vektor kan være undertegnet (indeksert) som en matrise. Indeksetelling begynner fra null.
vectorName [i]
Operasjonen "vectorName [i]" returnerer en referanse til elementet ved ith indeks av vektoren. Følgende kodeutganger 3.3 for ovennevnte vektor:
vektorflyte fl = vtr [2];
cout << fl << '\n';
vectorName [i] konst
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 vektorflyte fl = vtr [2];
cout << fl << '\n';
Uttrykket returnerer en konstant referanse til ith element av vektoren.
Tilordne en verdi med abonnement
En verdi kan tildeles en ikke-konstant vektor, som følger:
vektorvtr [2] = 8.8;
cout << vtr[2] << '\n';
Utgangen er 8.8.
vectorName.ved (i)
“VectorName.at (i) ”er som“ vectorName [i], ”men“ vectorName.at (i) ”er mer pålitelig. Følgende kode viser hvordan denne vektoren skal brukes:
vektorflyte fl = vtr.ved (2);
cout << fl << '\n';
at () er en vektormedlemfunksjon.
vectorName.ved (i) konst
“VectorName.at (i) const ”er som“ vectorName [i] const ”, men“ vectorName.at (i) const ”er mer pålitelig. “VectorName.at (i) const "utføres i stedet for" vectorName.at (i) ”når vektoren er en konstant vektor. Denne vektoren brukes i følgende kode:
const vektorflyte fl = vtr.ved (2);
cout << fl << '\n';
at () const er en vektormedlemfunksjon.
Tilordne en verdi med at () -funksjonen
En verdi kan tildeles en ikke-konstant vektor med at () -funksjonen, som følger:
vektorvtr.ved (2) = 8.8;
cout << vtr[2] << '\n';
Utgangen er 8.8.
Problem med sub-scripting
Problemet med sub-scripting (indeksering) er at hvis indeksen er utenfor området, 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. Resultatet av følgende kode er 1.1.
vektorflyte fl = vtr.front();
cout << fl << '\n';
Elementet fjernes ikke fra vektoren.
front () konst
Når vektorkonstruksjonen går foran const, blir uttrykket "front () const" utført i stedet for "front ().”Dette brukes i følgende kode:
const vektorflyte 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. Resultatet av følgende kode er 4.4.
vektorflyte fl = vtr.tilbake();
cout << fl << '\n';
tilbake () konst
Når vektorkonstruksjonen går foran const, blir uttrykket "back () const" utført i stedet for "back ().”Dette brukes i følgende kode:
const vektorflyte fl = vtr.tilbake();
cout << fl << '\n';
En konstant referanse returneres. Elementet fjernes ikke fra vektoren.
Vector Data Access
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 mer detaljert senere i artikkelen.
Returterende Iteratorer og Vector
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:
vektorvektor
cout << *iter << '\n';
Utgangen er 1.1. Merk at erklæringen som mottar iteratoren er erklært. Iteratoren blir referert i et returuttrykk for å oppnå verdien på samme måte som en peker blir referert til.
begin () const noexcept;
Returnerer en iterator som peker på det første elementet i vektoren. Når vektorkonstruksjonen går foran const, utføres uttrykket "start () const" i stedet for "start ().”Under denne tilstanden kan ikke det tilsvarende elementet i vektoren endres. Dette brukes i følgende kode:
const vektorvektor
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. Vurder følgende kodesegment:
vektorvektor
cout << *iter << '\n';
Utgangen er 0, som er meningsløs, da det ikke er noe konkret element utover det siste elementet.
end () const noexcept
Returnerer en iterator som peker rett utover det siste elementet i vektoren. Når vektorkonstruksjonen er innledet av "const", blir uttrykket "end () const" utført i stedet for "end ().Tenk på følgende kodesegment:
const vektorvektor
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:
vektorvektor
cout << *rIter << '\n';
Utgangen er 4.4.
Merk at erklæringen som mottar omvendt iterator er erklært. Iteratoren blir referert i et returuttrykk for å oppnå verdien på samme måte som en peker blir referert til.
rbegin () const noexcept;
Returnerer en iterator som peker på det siste elementet i vektoren. Når vektorkonstruksjonen er innledet av "const", blir uttrykket "rbegin () const" utført i stedet for "rbegin ().”Under denne betingelsen kan ikke det tilsvarende elementet i vektoren endres. Denne funksjonen brukes i følgende kode:
const vektorvektor
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. Vurder følgende kodesegment:
vektorvektor
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 foran "const", blir uttrykket "rend () const" utført i stedet for "rend ().Tenk på følgende kodesegment:
const vektorvektor
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.
Vector Modifiers
En modifikator som endrer vektoren kan ta eller returnere en iterator.
en.emplace (p, args)
Setter inn et objekt av typen T konstruert med std :: fremover
sett inn (iteratorPosisjon, verdi)
Setter inn en kopi av verdien i iteratorposisjonen til vektoren. Returnerer iteratoren (posisjon) i vektoren der kopien er plassert. Følgende kode viser hvor verdien er plassert:
vektorvektor
++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 (inkrementert) akkurat som en peker.
En initialiseringsliste kan også settes inn, som følgende kode illustrerer:
vektorvektor
++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 posisjonen som iteratoren peker på, og returnerer deretter iteratorposisjonen. Følgende kode illustrerer dette:
vektorvektor
++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:
vektorvtr.push_back (5.5);
flyte 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:
vektorvtr.pop_back ();
flyte sz = vtr.størrelse();
cout << sz << '\n';
Utgangen er 3.
en.bytte (b)
To vektorer kan byttes ut, som illustrert i følgende kodesegment:
vektorvektor
vtr1.bytte (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 0vtr2: 1.1 2.2 3.3 4.4
Merk at lengden på en vektor økes, om nødvendig. Verdier som ikke har erstatninger, blir også erstattet av noen standardverdier.
klar()
Fjerner alle elementer fra vektoren, som følgende kodesegment illustrerer:
vektorvtr.klar();
cout << vtr.size() << '\n';
Utgangen er 0.
Likestillings- og relasjonsoperatører for vektorer
Operatøren ==
Returnerer 1 for true hvis de to vektorene har samme størrelse og de tilsvarende elementene er like; Ellers returnerer den 0 for usann. For eksempel:
vektorvektor
bool bl = U == V;
cout << bl << '\n';
Utgangen er 0.
De != Operatør
Returnerer 1 for true hvis de to vektorene ikke har samme størrelse og / eller de tilsvarende elementene ikke er like; Ellers returnerer den 0 for usann. For eksempel:
vektorvektor
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 delene er de samme og i samme rekkefølge. Hvis begge vektorene er av 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 false. For eksempel:
vektorvektor
bool bl = U
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 det ordinære oppsettet og instantieres 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, fremoverliste og matrise. Hvis oppgaven innebærer hyppige innsettinger og slettinger midt i sekvensen, bør en liste eller fremoverliste 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 viktig.