Wie finden Sie etwas in einem Vektor in C++?

Wie finden Sie etwas in einem Vektor in C++?
C ++ - Vektor hat keine Fund -Mitgliedsfunktion. Die Algorithmus -Bibliothek hat jedoch eine Find () -Funktion verschiedener Typen, mit denen etwas in einem C ++ - Vektor gefunden werden kann. Die Algorithmus -Bibliothek verfügt über vier Gruppen von Find () -Funktionen, die als Find-, Find -Ende, Finding und angrenzende Fund klassifiziert werden können.

Um die Vektor- und Algorithmusbibliotheken zu verwenden, sollte das C ++ - Programm mit:

#enthalten
#enthalten
#enthalten
Verwenden von Namespace STD;

Dieses Tutorial gibt die Grundlagen, einen Wert in einem C ++ - Vektor zu finden. Der gesamte Code in diesem Tutorial befindet sich in der Funktion main (), sofern nicht anders angegeben. Wenn der Vektor aus Zeichenfolgen besteht, verwenden Sie die String -Klasse. und verwenden Sie nicht "const char*". In diesem Fall muss auch die String -Klasse einbezogen werden, wie so:

#enthalten

Artikelinhalt

  • finden()
  • Ganzzahl finden
  • Prädikat
  • Abschluss

Finden

InputIterator Find (InputIterator zuerst, InputIterator Last, const t & value);

Der folgende Code verwendet diese Funktion, um zu wissen, ob die Blume „Maisblume“ zu einer Vektorliste von Blumen gehört:

#enthalten
#enthalten
#enthalten
#enthalten
Verwenden von Namespace STD;
int main ()

vectorvtr = "Dog Rose", "Honeysuckle", "Enchanter's Nightshade", "Columbine", "Kingcup", "Maisblume", "Water Avens", "Vergiss-me-nicht";
Vektor :: Iterator it = find (vtr.begin (), vtr.End (), "Maisblume");
if (it == vtr.Ende())
Cout<< "Flower was not found!" <anders
Cout<< "Flower found at index: " << it - vtr.begin() <Rückkehr 0;

Die Ausgabe ist:

Blume bei Index gefunden: 5

Die gesamte Liste des Vektors war das Ziel für den Befund. Aus der Syntax der Find () -Funktion ist „First“ VTR.begin () im Code und "letztes" ist VTR.end () im Code. Der Wert, nach dem aus der Find () -Funktionssyntax, die mit Const-T & -wert bezeichnet wird.

Die Funktion find () scannt die Vektorliste von Anfang an. Wenn es nicht den Wert sieht, den es sucht, erreicht es das Ende des Vektors. Das Ende des Vektors ist offiziell vtr.End (), was gerade über das letzte Element liegt. Wenn es nicht den Wert sieht, den es sucht, gibt es den Iterator zurück, der auf VTR zeigt.Ende().

Der Wert, den es sucht, kann an verschiedenen Stellen im selben Vektor liegen. Wenn es den ersten der gesuchten Werte sieht, stoppt es dort und gibt den Iterator zurück, der auf diesen Wert hinweist.

Jeder Wert in einem Vektor hat einen Index. Der erste Wert hat Index 0, der VTR entspricht.Start(). Der zweite Wert hat Index 1, der VTR entspricht.begin () + 1. Der dritte Wert hat Index 2, der VTR entspricht.begin () + 2. Der vierte Wert hat Index 3, der VTR entspricht.begin () + 3; usw. Der Index des ersten Werts ist also angegeben durch:

es - vtr.Start()

Fallempfindlichkeit

Das Finden in einem Vektor ist fallsempfindlich. Wenn der zu findene Wert „Maisblüten“ für das obige Programm wäre, wäre er nicht gefunden worden, und VTR.End () wäre zurückgegeben worden.

Bereich innerhalb von Grenzen

Der Bereich darf nicht unbedingt der gesamte Vektor sein. Für das obige Programm hätte der Bereich von Index 1 bis Index 4 gewesen sein können. Das heißt, aus „vtr.begin () + 1 “bis„ vtr.end () - 4 ”. „VTR.End () - 4 ”wird durch Subtrahieren von hinten erhalten und beachtet.End () ist direkt jenseits des allerletzten Elements.

Wenn die gesamte Vektorliste der Bereich ist, testen Sie, ob der Rückgabe -Iterator VTR ist.End () gibt an, ob der Wert gefunden wurde oder nicht. Wenn der Rückgabe -Iterator VTR ist.End () bedeutet, dass der Wert nicht gefunden wurde. Wenn nun der Bereich kleiner ist, bedeutet dies, dass der Wert entweder nicht gefunden wurde oder der letzte Wert des Bereichs ist, wenn der Rückgabe -Iterator das letzte Element des gewählten Bereichs ist.

Notiz: Suchstopps im letzten Element des ausgewählten (kleineren) Bereichs, wenn der Wert nicht in diesem Bereich gefunden wurde oder wenn der gefundene Wert das letzte Element des gewählten Bereichs ist. Wenn der gefundene Wert dieses letzte Element wäre, würde ein Iterator, der darauf zeigt, zurückgegeben. Wenn der Wert zuvor gefunden würde, würde die Suche in diesem Element vor dem letzten Element des gewählten Bereichs anhalten. Der Iterator dieses Elements zuvor würde zurückgegeben.

Der folgende Code zeigt dieses Schema:

#enthalten
#enthalten
#enthalten
#enthalten
Verwenden von Namespace STD;
int main ()

vectorvtr = "Dog Rose", "Honeysuckle", "Enchanter's Nightshade", "Columbine", "Kingcup", "Maisblume", "Water Avens", "Vergiss-me-nicht";
Vektor :: Iterator it = find (vtr.begin () + 1, vtr.End () - 4, "Maisblume");
if (it == vtr.Ende())
Cout<< "Flower was not found!" <sonst wenn (es - vtr.begin () == 4) // Letztes Element im ausgewählten Bereich
if (*it == string ("Maisblüten"))
Cout<< "Flower found at index: " << it - vtr.begin() <anders
Cout<< "Flower was not found in range!" <
anders
Cout<< "Flower found at index: " << it - vtr.begin() <
Rückkehr 0;

Die Ausgabe ist:

Blume wurde nicht in Reichweite gefunden!

Jetzt ist "Cornflower" in Index 5 und "Kingcup" ist in Index 4. Das letzte Element in der für die Suche ausgewählten kleinen Bereiche ist "Kingcup". Die entsprechende Testbedingung lautet also „It - VTR.begin () == 4 ”. Beachten Sie, dass die Ausdrücke „VTR.end () - 4 ”und„ it - vtr.begin () == 4 ”jeweils 4 ist nur zufällig.

Um "Maisblumen" im kleinen Bereich zu haben, muss die entsprechende Testbedingung "It - VTR" sein.begin () == 5 ”. Der folgende Code zeigt dies:

#enthalten
#enthalten
#enthalten
#enthalten
Verwenden von Namespace STD;
int main ()

vectorvtr = "Dog Rose", "Honeysuckle", "Enchanter's Nightshade", "Columbine", "Kingcup", "Maisblume", "Water Avens", "Vergiss-me-nicht";
Vektor :: Iterator it = find (vtr.begin () + 1, vtr.End () - 3, "Maisblume");
if (it == vtr.Ende())
Cout<< "Flower was not found!" <sonst wenn (es - vtr.begin () == 5)
if (*it == string ("Maisblüten"))
Cout<< "Flower found at index: " << it - vtr.begin() <anders
Cout<< "Flower was not found in range!" <
anders
Cout<< "Flower found at index: " << it - vtr.begin() <
Rückkehr 0;

Die Ausgabe ist:

Blume bei Index gefunden: 5

Mehr als ein Ereignis

Im folgenden Programm tritt „Maisblume“ an mehr als einem Ort auf. Um alle Indizes der Vorkommen zu finden, verwenden Sie eine Weile Schleife, um die Suche nach dem vorherigen Auftreten bis zum Ende fortzusetzen (VTR.End ()) des Vektors. Das Programm ist:

#enthalten
#enthalten
#enthalten
#enthalten
Verwenden von Namespace STD;
int main ()

vectorvtr = "Hunderose", "Maisblume", "Enchanters Nachtschatten", "Columbine", "Kingcup", "Maisblume", "Wasser Avens", "Maisblume";
Vektor :: Iterator it = find (vtr.begin (), vtr.End (), "Maisblume");
während es != vtr.Ende())
if (*it == string ("Maisblüten"))
Cout<< "Flower found at index: " << it - vtr.begin() <es ++;

Rückkehr 0;

Die Ausgabe ist:

Blume bei Index gefunden: 1
Blume bei Index gefunden: 5
Blume bei Index gefunden: 7

Ganzzahl finden

Ein Vektor kann aus Ganzzahlen bestehen. Ein erster ganzzahliger Wert kann unter Verwendung der Find () -Funktion (aus der Algorithmus -Bibliothek) gefunden werden). Das folgende Programm zeigt dies:

#enthalten
#enthalten
#enthalten
Verwenden von Namespace STD;
int main ()

vectorVtr = 1, 2, 3, 1, 2, 3, 1, 2, 3;
Vektor :: Iterator it = find (vtr.begin (), vtr.End (), 3);
if (it == vtr.Ende())
Cout<< "Number was not found!" <anders
Cout<< "Number found at index: " << it - vtr.begin() <Rückkehr 0;

Die Ausgabe ist:

Nummer bei Index gefunden: 2
Für das erste Ereignis des Wertes 3.

Prädikat

InputIterator find_if (InputIterator zuerst, InputIterator Last, Predicate Pred);

Die Funktion hier ist find_if () und nicht nur find (). Pred ist der Name der Funktion, die die Suchkriterien angibt. Dieses dritte Argument nimmt nur den Funktionsnamen, ohne Argumente und ohne Klammern. Wenn die Prädikatfunktion Argument nimmt, werden in der Funktionsdefinition die Parameter für die Argumente angegeben. Das folgende Programm zeigt dies und sucht nach der ersten gleichmäßigen Zahl in der Vektorliste:

#enthalten
#enthalten
#enthalten
Verwenden von Namespace STD;
bool fn (int n)
if ((n % 2) == 0)
zurückkehren;
anders
falsch zurückgeben;

int main ()

VectorVtr = 1, 3, 5, 7, 8, 9, 10, 11, 12;
Vektor :: Iterator it = find_if (vtr.begin (), vtr.end (), fn);
if (it == vtr.Ende())
Cout<< "Number was not found!" <anders
Cout<< "Number found at index: " << it - vtr.begin() <Rückkehr 0;

Die Ausgabe ist:

Nummer bei Index gefunden: 4

Beachten Sie, dass der gesamte Vektor mit dem Bereich „VTR“ durchsucht wurde.begin (), vtr.Ende()".

Der Name der Prädikatfunktion hier ist, fn. Es braucht ein Argument, n an int. Da die Funktion find_if () beginnt, den Vektor aus dem ersten Element zu scannen, ruft sie die Prädikatfunktion mit jeder Zahl im Vektor als Argument auf. Das Scannen stoppt, wenn es das erste Element im Vektor erreicht, in dem das Prädikat wahr zurückgibt.

Abschluss

Die Find () -Funktion in der Algorithmus -Bibliothek gibt. Nur die Kategorie wurde oben und in hohem Maße erläutert. Die oben angegebene Erklärung sind die Basen für alle Find () -Funktionen in der Algorithmus -Bibliothek. Find () Funktionen befassen sich direkt mit Iteratoren und bearbeiten Sie indirekt mit Indizes. Der Programmierer muss wissen.