Hvordan finner du noe i en vektor i C++?

Hvordan finner du noe i en vektor i C++?
C ++ vektor har ikke en Find -medlemsfunksjon. Imidlertid har algoritmebiblioteket en funn () -funksjon av forskjellige typer som kan brukes til å finne noe i en C ++ vektor. Algoritmebiblioteket har fire grupper av funnfunksjoner som kan klassifiseres som Find, Find End, Find First og tilstøtende funn.

For å bruke vektor- og algoritmebibliotekene, bør C ++ -programmet begynne med:

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

Denne opplæringen gir det grunnleggende om å finne en verdi i en C ++ vektor. All kode i denne opplæringen er i hovedfunksjonen (), med mindre annet er angitt. Hvis vektoren består av strenger, bruk strengklassen; og ikke bruk "const char*". I dette tilfellet må strengklassen også inkluderes, slik:

#inkludere

Artikkelinnhold

  • finne()
  • Finne heltall
  • Predikat
  • Konklusjon

Finne

InputIterator Find (InputIterator First, InputIterator Last, Const T & Value);

Følgende kode bruker denne funksjonen for å vite om blomsten, "Cornflower" er blant en vektorliste over blomster:

#inkludere
#inkludere
#inkludere
#inkludere
ved hjelp av navneområdet STD;
int main ()

VectorVtr = "Dog Rose", "Honeysuckle", "Enchanter's Nightshade", "Columbine", "Kingcup", "Cornflower", "Water Avens", "Glem-meg-ikke";
vektor :: iterator it = finn (VTR.Begynn (), VTR.end (), "Cornflower");
if (it == VTR.slutt())
cout<< "Flower was not found!" <ellers
cout<< "Flower found at index: " << it - vtr.begin() <retur 0;

Utgangen er:

Blomst funnet ved indeks: 5

Hele listen over vektoren har vært målet for funnet. Fra syntaksen til Find () -funksjonen er “First” VTR.Begynn () i koden, og “sist” er VTR.slutt () i koden. Verdien som skal sees etter fra Find () -funksjonssyntaxen betegnet med Const-T & -Value, er "Cornflower" i koden.

Finn () -funksjonen skanner vektorlisten fra begynnelsen. Hvis den ikke ser verdien den leter etter, vil den nå slutten av vektoren. Slutten av vektoren er offisielt VTR.slutt (), som er rett utenfor det siste elementet. Hvis den ikke ser verdien den leter etter, vil den returnere iteratoren som peker til VTR.slutt().

Verdien det leter etter kan være forskjellige steder i samme vektor. Når den ser den første av verdiene den leter etter, stopper den der og returnerer iteratoren som peker på den verdien.

Hver verdi i en vektor har en indeks. Den første verdien har indeks 0, tilsvarende VTR.begynne(). Den andre verdien har indeks 1, tilsvarende VTR.Begynn () + 1. Den tredje verdien har indeks 2, tilsvarende VTR.Begynn () + 2. Den fjerde verdien har indeks 3, tilsvarende VTR.begynn () + 3; og så videre. Så indeksen for den første verdien som er funnet er gitt av:

IT - VTR.begynne()

Saksfølsomhet

Å finne i en vektor er tilfelle følsom. Hvis verdien som ble funnet var "Cornflower" for programmet ovenfor, ville det ikke blitt funnet, og VTR.slutt () ville blitt returnert.

Rekkevidde innenfor grenser

Rekkevidden må ikke nødvendigvis være hele vektoren. For programmet ovenfor kunne området ha vært fra indeks 1 til indeks 4. Det vil si fra “VTR.Begynn () + 1 ”til“ VTR.End () - 4 ”. “VTR.End () - 4 ”oppnås ved å trekke fra ryggen, med tanke på at VTR.slutt () er rett utenfor det aller siste elementet.

Når hele vektorlisten er området, tester du om returneratoren er VTR.slutt () indikerer om verdien ble funnet eller ikke. Hvis retureratoren er VTR.slutt (), det betyr at verdien ikke ble funnet. Når området er mindre, hvis retureratoren er det siste elementet i området valgt, betyr det at verdien enten ikke ble funnet, eller det er den siste verdien av området.

Merk: Søkestopp ved det siste elementet i det valgte (mindre) området, hvis verdien ikke ble funnet i det området, eller hvis verdien ble funnet, er det siste elementet i det valgte området. Hvis verdien som ble funnet var det siste elementet, ville en iterator som pekte på den bli returnert. Hvis verdien ble funnet før, ville søket stoppe ved det elementet før det siste elementet i det valgte området. Iteratoren av det elementet før ville bli returnert.

Følgende kode illustrerer denne ordningen:

#inkludere
#inkludere
#inkludere
#inkludere
ved hjelp av navneområdet STD;
int main ()

VectorVtr = "Dog Rose", "Honeysuckle", "Enchanter's Nightshade", "Columbine", "Kingcup", "Cornflower", "Water Avens", "Glem-meg-ikke";
vektor :: iterator it = finn (VTR.Begynn () + 1, VTR.End () - 4, "Cornflower");
if (it == VTR.slutt())
cout<< "Flower was not found!" <ellers hvis (det - VTR.Begynn () == 4) // Siste element i valgt rekkevidde
if (*it == String ("Cornflower"))
cout<< "Flower found at index: " << it - vtr.begin() <ellers
cout<< "Flower was not found in range!" <
annet
cout<< "Flower found at index: " << it - vtr.begin() <
retur 0;

Utgangen er:

Blomsten ble ikke funnet i rekkevidde!

Nå er "Cornflower" på indeks 5, og "Kingcup" er på indeks 4. Det siste elementet i det lille området valgt for søk er "Kingcup". Så den tilsvarende testtilstanden er “IT - VTR.begynn () == 4 ”. Legg merke til at uttrykkene, “VTR.Slutt () - 4 ”og“ It - VTR.begynn () == 4 ”hver som har 4, er bare tilfeldigheter.

For å ha "maisblomst" i det lille området søk, vil den tilsvarende testtilstanden måtte være "IT - VTR.begynn () == 5 ”. Følgende kode illustrerer dette:

#inkludere
#inkludere
#inkludere
#inkludere
ved hjelp av navneområdet STD;
int main ()

VectorVtr = "Dog Rose", "Honeysuckle", "Enchanter's Nightshade", "Columbine", "Kingcup", "Cornflower", "Water Avens", "Glem-meg-ikke";
vektor :: iterator it = finn (VTR.Begynn () + 1, VTR.End () - 3, "Cornflower");
if (it == VTR.slutt())
cout<< "Flower was not found!" <ellers hvis (det - VTR.begynn () == 5)
if (*it == String ("Cornflower"))
cout<< "Flower found at index: " << it - vtr.begin() <ellers
cout<< "Flower was not found in range!" <
annet
cout<< "Flower found at index: " << it - vtr.begin() <
retur 0;

Utgangen er:

Blomst funnet ved indeks: 5

Mer enn en forekomst

I det følgende programmet forekommer "Cornflower" på mer enn ett sted. For å finne alle indeksene i forekomstene, bruk en stundesløyfe for å fortsette søk, etter forrige forekomst, til slutten (VTR.end ()) av vektoren. Programmet er:

#inkludere
#inkludere
#inkludere
#inkludere
ved hjelp av navneområdet STD;
int main ()

VectorVtr = "Dog Rose", "Cornflower", "Enchanter's Nightshade", "Columbine", "Kingcup", "Cornflower", "Water Avens", "Cornflower";
vektor :: iterator it = finn (VTR.Begynn (), VTR.end (), "Cornflower");
mens (det != VTR.slutt())
if (*it == String ("Cornflower"))
cout<< "Flower found at index: " << it - vtr.begin() <det ++;

retur 0;

Utgangen er:

Blomst funnet ved indeks: 1
Blomst funnet ved indeks: 5
Blomst funnet ved indeks: 7

Finne heltall

En vektor kan bestå av heltall. En første heltallverdi finner du ved bruk av Find () -funksjonen (fra algoritmebiblioteket). Følgende program illustrerer dette:

#inkludere
#inkludere
#inkludere
ved hjelp av navneområdet STD;
int main ()

VectorVtr = 1, 2, 3, 1, 2, 3, 1, 2, 3;
vektor :: iterator it = finn (VTR.Begynn (), VTR.end (), 3);
if (it == VTR.slutt())
cout<< "Number was not found!" <ellers
cout<< "Number found at index: " << it - vtr.begin() <retur 0;

Utgangen er:

Antall funnet ved indeks: 2
for den første forekomsten av verdien, 3.

Predikat

InputIterator FIND_IF (InputIterator First, InputIterator Last, Predicate Pred);

Funksjonen her er find_if () og ikke bare finne (). Pred er navnet på funksjonen som gir søkekriteriene. Dette tredje argumentet tar bare funksjonsnavnet, uten argumenter og uten parenteser. Hvis predikatfunksjonen tar argument, blir parametrene for argumentene gitt i funksjonsdefinisjonen. Følgende program illustrerer dette, på jakt etter det første til og med nummeret i vektorlisten:

#inkludere
#inkludere
#inkludere
ved hjelp av navneområdet STD;
bool fn (int n)
if ((n % 2) == 0)
return True;
ellers
return falsk;

int main ()

VectorVtr = 1, 3, 5, 7, 8, 9, 10, 11, 12;
vektor :: iterator it = find_if (VTR.Begynn (), VTR.end (), fn);
if (it == VTR.slutt())
cout<< "Number was not found!" <ellers
cout<< "Number found at index: " << it - vtr.begin() <retur 0;

Utgangen er:

Antall funnet ved indeks: 4

Merk at hele vektoren er søkt, med området, “VTR.Begynn (), VTR.slutt()".

Predikatfunksjonsnavnet her er, fn. Det krever ett argument, n en int. Når Find_if () -funksjonen begynner å skanne vektoren fra det første elementet, kaller den predikatfunksjonen med hvert tall i vektoren som argument. Skanning stopper når det når det første elementet i vektoren der predikatet returnerer sant.

Konklusjon

Finn () -funksjonen i algoritmebiblioteket eksisterer i fire kategorier, som er: Finn, finn slutt, finn først og tilstøtende funn. Bare kategorien, funn er blitt forklart ovenfor, og i stor grad. Forklaringen gitt ovenfor er basene for alle funn () -funksjonene i algoritmebiblioteket. Finn () funksjoner omhandler iteratorer direkte og håndterer indekser indirekte. Programmereren må vite hvordan man konverterer iterator til indeks og generell iterator aritmetikk som illustrert ovenfor.