Come trovi qualcosa in un vettore in C++?

Come trovi qualcosa in un vettore in C++?
Il vettore C ++ non ha una funzione di trovare membro. Tuttavia, la libreria dell'algoritmo ha una funzione find () di diversi tipi che possono essere utilizzati per trovare qualcosa in un vettore C ++. La libreria dell'algoritmo ha quattro gruppi di funzioni di ricerca () che possono essere classificate come troving, find end, fint per primo e adiacente.

Per utilizzare le librerie vettoriali e algoritmo, il programma C ++ dovrebbe iniziare con:

#includere
#includere
#includere
Utilizzo dello spazio dei nomi std;

Questo tutorial fornisce le basi di trovare un valore in un vettore C ++. Tutto il codice in questo tutorial è nella funzione principale (), se non diversamente indicato. Se il vettore è costituito da stringhe, utilizzare la classe String; e non usare "const char*". In questo caso, anche la classe di stringhe deve essere inclusa, come così:

#includere

Contenuto dell'articolo

  • Trovare()
  • Trovare intero
  • Predicato
  • Conclusione

Trovare

InputIterator Find (inputIterator First, inputIterator Last, const t & value);

Il seguente codice utilizza questa funzione per sapere se il fiore, "flusso di mais" è tra un elenco vettoriale di fiori:

#includere
#includere
#includere
#includere
Utilizzo dello spazio dei nomi std;
int main ()

vectorvtr = "dog rose", "caprifoglio", "enchanter's nightshade", "columbine", "kingcup", "cornflower", "water aurns", "dimentica-me-not";
Vector :: iterator IT = Find (VTR.inizio (), vtr.fine (), "flotta di mais");
if (it == vtr.FINE())
cout<< "Flower was not found!" <altro
cout<< "Flower found at index: " << it - vtr.begin() <restituzione 0;

L'output è:

Fiore trovato all'indice: 5

L'intero elenco del vettore è stato l'obiettivo della scoperta. Dalla sintassi della funzione Find (), "First" è VTR.inizio () nel codice e "ultimo" è VTR.end () nel codice. Il valore da cercare dalla sintassi della funzione Find () indicata da const-T & -Value, è "flotta di mais" nel codice.

La funzione find () scansiona l'elenco vettoriale dall'inizio. Se non vede il valore che sta cercando, raggiungerà la fine del vettore. La fine del vettore è ufficialmente VTR.end (), che è appena oltre l'ultimo elemento. Se non vede il valore che sta cercando, restituirà l'iteratore che punta a VTR.FINE().

Il valore che sta cercando può essere in luoghi diversi nello stesso vettore. Quando vede il primo dei valori che sta cercando, si ferma lì e restituisce l'iteratore che punta a quel valore.

Ogni valore in un vettore ha un indice. Il primo valore ha l'indice 0, corrispondente a VTR.inizio(). Il secondo valore ha l'indice 1, corrispondente a VTR.inizio () + 1. Il terzo valore ha l'indice 2, corrispondente a VTR.inizio () + 2. Il quarto valore ha l'indice 3, corrispondente a VTR.inizio () + 3; e così via. Quindi, l'indice del primo valore trovato è dato da:

IT - VTR.inizio()

Sensibilità al caso

Trovare in un vettore è sensibile al caso. Se il valore da trovare fosse "flusso di corn" per il programma di cui sopra, non sarebbe stato trovato e VTR.la fine () sarebbe stata restituita.

Intervallo entro limiti

La gamma non deve necessariamente essere l'intero vettore. Per il programma di cui sopra, l'intervallo avrebbe potuto essere dall'indice 1 all'indice 4. Cioè da "vtr.Inizia () + 1 "a" VTR.end () - 4 ". “VTR.end () - 4 "è ottenuto sottraendo dalla parte posteriore, tenendo presente quel VTR.end () è appena oltre l'ultimo elemento.

Quando l'intero elenco vettoriale è l'intervallo, testare se l'iteratore di restituzione è VTR.fine () indica se il valore è stato trovato o meno. Se l'iteratore di ritorno è VTR.fine (), significa che il valore non è stato trovato. Ora, quando l'intervallo è più piccolo, se l'iteratore di ritorno è l'ultimo elemento dell'intervallo scelto, significa che il valore non è stato trovato o è l'ultimo valore dell'intervallo.

Nota: La ricerca si ferma all'ultimo elemento dell'intervallo scelto (più piccolo), se il valore non è stato trovato in quell'intervallo, o se il valore trovato, è l'ultimo elemento dell'intervallo scelto. Se il valore trovato fosse quell'ultimo elemento, un iteratore che punta ad esso sarebbe stato restituito. Se il valore fosse stato trovato prima, la ricerca si fermerebbe a quell'elemento prima dell'ultimo elemento dell'intervallo scelto. L'iteratore di quell'elemento prima sarebbe stato restituito.

Il seguente codice illustra questo schema:

#includere
#includere
#includere
#includere
Utilizzo dello spazio dei nomi std;
int main ()

vectorvtr = "dog rose", "caprifoglio", "enchanter's nightshade", "columbine", "kingcup", "cornflower", "water aurns", "dimentica-me-not";
Vector :: iterator IT = Find (VTR.inizio () + 1, vtr.end () - 4, "cornflower");
if (it == vtr.FINE())
cout<< "Flower was not found!" <altrimenti se (esso - vtr.inizio () == 4) // Ultimo elemento nell'intervallo scelto
if (*it == String ("CornFlower"))
cout<< "Flower found at index: " << it - vtr.begin() <altro
cout<< "Flower was not found in range!" <
altro
cout<< "Flower found at index: " << it - vtr.begin() <
restituzione 0;

L'output è:

Il fiore non è stato trovato nella gamma!

Ora, "Cornflower" è all'indice 5 e "Kingcup" è all'indice 4. L'ultimo elemento nella piccola gamma scelta per la ricerca è "Kingcup". Quindi, la condizione di test corrispondente è “It - VTR.inizio () == 4 ". Si noti che le espressioni, “VTR.end () - 4 "e" it - vtr.inizio () == 4 "ciascuno con 4, è solo una coincidenza.

Per avere un "flusso di mais" nella piccola gamma di ricerca, la condizione di test corrispondente dovrà essere “It - VTR.inizio () == 5 ". Il seguente codice illustra questo:

#includere
#includere
#includere
#includere
Utilizzo dello spazio dei nomi std;
int main ()

vectorvtr = "dog rose", "caprifoglio", "enchanter's nightshade", "columbine", "kingcup", "cornflower", "water aurns", "dimentica-me-not";
Vector :: iterator IT = Find (VTR.inizio () + 1, vtr.end () - 3, "cornflower");
if (it == vtr.FINE())
cout<< "Flower was not found!" <altrimenti se (esso - vtr.inizio () == 5)
if (*it == String ("CornFlower"))
cout<< "Flower found at index: " << it - vtr.begin() <altro
cout<< "Flower was not found in range!" <
altro
cout<< "Flower found at index: " << it - vtr.begin() <
restituzione 0;

L'output è:

Fiore trovato all'indice: 5

Più di un evento

Nel seguente programma, il "flusso di mais" si verifica in più di un posto. Per trovare tutti gli indici delle occorrenze, utilizzare un ciclo while per continuare la ricerca, dopo la precedente occorrenza, fino alla fine (VTR.fine ()) del vettore. Il programma è:

#includere
#includere
#includere
#includere
Utilizzo dello spazio dei nomi std;
int main ()

vectorvtr = "dog rose", "cornflower", "enchanter's nightshade", "columbine", "kingcup", "cornflower", "water aurns", "cornflower";
Vector :: iterator IT = Find (VTR.inizio (), vtr.fine (), "flotta di mais");
mentre (esso != vtr.FINE())
if (*it == String ("CornFlower"))
cout<< "Flower found at index: " << it - vtr.begin() <It ++;

restituzione 0;

L'output è:

Fiore trovato all'indice: 1
Fiore trovato all'indice: 5
Fiore trovato all'indice: 7

Trovare intero

Un vettore può essere costituito da numeri interi. È possibile trovare un primo valore intero utilizzando la funzione find () (dalla libreria dell'algoritmo). Il seguente programma illustra questo:

#includere
#includere
#includere
Utilizzo dello spazio dei nomi std;
int main ()

vectorvtr = 1, 2, 3, 1, 2, 3, 1, 2, 3;
Vector :: iterator IT = Find (VTR.inizio (), vtr.fine (), 3);
if (it == vtr.FINE())
cout<< "Number was not found!" <altro
cout<< "Number found at index: " << it - vtr.begin() <restituzione 0;

L'output è:

Numero trovato all'indice: 2
Per la prima occorrenza del valore, 3.

Predicato

InputIterator find_if (inputIterator prima, inputterator ultimo, predicato pred);

La funzione qui è find_if () e non solo trovare (). PRED è il nome della funzione che fornisce i criteri di ricerca. Questo terzo argomento prende solo il nome della funzione, senza argomenti e senza parentesi. Se la funzione predicato prende argomento, allora nella definizione della funzione, vengono forniti i parametri per gli argomenti. Il seguente programma lo illustra, alla ricerca del primo numero pari nell'elenco vettoriale:

#includere
#includere
#includere
Utilizzo dello spazio dei nomi std;
bool fn (int n)
if ((n % 2) == 0)
restituire vero;
altro
restituire false;

int main ()

vectorvtr = 1, 3, 5, 7, 8, 9, 10, 11, 12;
Vector :: iterator it = find_if (VTR.inizio (), vtr.end (), fn);
if (it == vtr.FINE())
cout<< "Number was not found!" <altro
cout<< "Number found at index: " << it - vtr.begin() <restituzione 0;

L'output è:

Numero trovato all'indice: 4

Si noti che l'intero vettore è stato cercato, con l'intervallo "VTR.inizio (), vtr.FINE()".

Il nome della funzione predicato qui è, fn. Ci vuole una discussione, n un int. Poiché la funzione find_if () inizia a scansionare il vettore dal primo elemento, chiama la funzione predicato con ciascun numero nel vettore come argomento. La scansione si interrompe quando raggiunge il primo elemento nel vettore in cui il predicato restituisce vero.

Conclusione

La funzione Find () nella libreria dell'algoritmo esiste in quattro categorie, che sono: trovare, trovare fine, trovare prima e adiacente. Solo la categoria, la scoperta è stata spiegata sopra e in larga misura. La spiegazione sopra indicata sono le basi per tutte le funzioni di ricerca () nella libreria dell'algoritmo. Trova () le funzioni si occupano direttamente degli iteratori e gestiscono indirettamente gli indici. Il programmatore deve sapere come convertire l'iteratore in indicizzazione e aritmetica generale iterator come illustrato sopra.