Jak znaleźć coś w wektorze w C++?

Jak znaleźć coś w wektorze w C++?
C ++ wektor nie ma funkcji znalezienia członka. Jednak biblioteka algorytmu ma funkcję Find () różnych typów, które można użyć do znalezienia czegoś w wektorze C ++. Biblioteka algorytmu ma cztery grupy funkcji FINK (), które można sklasyfikować jako znalezienie, Znajdź, znajdź pierwszy i sąsiednie znalezisko.

Aby użyć bibliotek wektora i algorytmu, program C ++ powinien zacząć od:

#włączać
#włączać
#włączać
za pomocą przestrzeni nazw Std;

Ten samouczek zawiera podstawy znalezienia wartości w wektorze C ++. Cały kod w tym samouczku znajdują się w funkcji Main (), chyba że wskazano inaczej. Jeśli wektor składa się z ciąży, użyj klasy String; i nie używaj „const char*”. W takim przypadku należy również uwzględnić klasę ciągów, jak:

#włączać

Treść artykułu

  • znajdować()
  • Znalezienie liczby całkowitej
  • Orzec
  • Wniosek

Znajdować

Inputiterator Find (inputiterator First, Inputiterator Last, const t & wartość);

Poniższy kod używa tej funkcji, aby wiedzieć, czy kwiat „Cornflower” jest jednym z wektorowej listy kwiatów:

#włączać
#włączać
#włączać
#włączać
za pomocą przestrzeni nazw Std;
int main ()

VectorVtr = „Dog Rose”, „Honeysuckle”, „Enchanter's Nightshade”, „Columbine”, „Kingcup”, „Cornflower”, „Water Avens”, „Forget-me-not”;
wektor :: iterator it = znajdź (vtr.początek (), vtr.end (), „Cornflower”);
if (to == vtr.koniec())
Cout<< "Flower was not found!" <w przeciwnym razie
Cout<< "Flower found at index: " << it - vtr.begin() <powrót 0;

Wyjście to:

Kwiat znaleziony na indeksie: 5

Cała lista wektora była celem odkrycia. Z składni funkcji Find () „Pierwsza” to VTR.początek () w kodzie, a „last” to VTR.end () w kodzie. Wartość, której należy szukać z składni funkcji FINK (.

Funkcja Find () skanuje listę wektorów od samego początku. Jeśli nie zobaczy wartości, której szuka, dotrze do końca wektora. Koniec wektora jest oficjalnie VTR.end (), który jest tuż poza ostatnim elementem. Jeśli nie zobaczy wartości, której szuka, zwróci iterator wskazujący na VTR.koniec().

Wartość, której szuka, może znajdować się w różnych miejscach w tym samym wektorze. Kiedy zobaczy pierwszą z wartości, których szuka, zatrzymuje się i zwraca iterator, który wskazuje na tę wartość.

Każda wartość w wektorze ma indeks. Pierwsza wartość ma indeks 0, odpowiadający VTR.zaczynać(). Druga wartość ma indeks 1, odpowiadający VTR.początek () + 1. Trzecia wartość ma indeks 2, odpowiadający VTR.początek () + 2. Czwarta wartość ma wskaźnik 3, odpowiadający VTR.początek () + 3; i tak dalej. Tak więc indeks pierwszej znalezionej wartości jest podany przez:

It - vtr.zaczynać()

Rozróżnianie wielkości liter

Znalezienie w wektorze jest wrażliwe na przypadki. Gdyby znaleziono wartość „Cornflower” dla powyższego programu, nie zostałby znaleziony i VTR.end () zostałby zwrócony.

Zakres w granicach

Zakres niekoniecznie musi być cały wektor. Dla powyższego programu może być od indeksu 1 do indeksu 4. To znaczy „vtr.początek () + 1 ”do„ VTR.end () - 4 ”. „Vtr.end () - 4 ”uzyskuje się przez odejmowanie od tyłu, mając na uwadze, że vtr.end () jest tuż poza ostatnim elementem.

Kiedy cała lista wektorów jest zakresem, testowanie, czy iterator powrotny to VTR.end () wskazuje, czy wartość została znaleziona, czy nie. Jeśli iterator powrotny to VTR.end (), oznacza to, że wartość nie została znaleziona. Teraz, gdy zakres jest mniejszy, jeśli iterator powrotny jest ostatnim elementem wybranego zakresu, oznacza to, że wartość albo nie znaleziono lub jest ostatnią wartością zakresu.

Notatka: Wyszukiwanie zatrzymuje się w ostatnim elemencie wybranego (mniejszego) zakresu, jeśli wartość nie została znaleziona w tym zakresie, lub jeśli znaleziona wartość jest ostatnim elementem wybranego zakresu. Gdyby znaleziono wartość ten ostatni element, iterator wskazujący na niego, zostałby zwrócony. Gdyby wartość była wcześniej znaleziona, wyszukiwanie zatrzymałoby się na tym elemencie przed ostatnim elementem wybranego zakresu. Iterator tego elementu wcześniej zostanie zwrócony.

Poniższy kod ilustruje ten schemat:

#włączać
#włączać
#włączać
#włączać
za pomocą przestrzeni nazw Std;
int main ()

VectorVtr = „Dog Rose”, „Honeysuckle”, „Enchanter's Nightshade”, „Columbine”, „Kingcup”, „Cornflower”, „Water Avens”, „Forget-me-not”;
wektor :: iterator it = znajdź (vtr.początek () + 1, vtr.end () - 4, „Cornflower”);
if (to == vtr.koniec())
Cout<< "Flower was not found!" <w przeciwnym razie if (to - vtr.begin () == 4) // ostatni element w wybranym zakresie
if (*it == String („cornflower”))
Cout<< "Flower found at index: " << it - vtr.begin() <w przeciwnym razie
Cout<< "Flower was not found in range!" <
w przeciwnym razie
Cout<< "Flower found at index: " << it - vtr.begin() <
powrót 0;

Wyjście to:

Kwiat nie został znaleziony w zasięgu!

Teraz „Cornflower” znajduje się w indeksie 5, a „Kingcup” znajduje się w indeksie 4. Ostatnim elementem w małym zakresie wybranym do wyszukiwania jest „Kingcup”. Tak więc odpowiadającym warunkiem testowym jest „to - vtr.początek () == 4 ”. Zauważ, że wyrażenia „VTR.end () - 4 ”i„ It - vtr.początek () == 4 ”każdy ma 4, to po prostu zbieg okoliczności.

Aby mieć „Cornflower” w niewielkim zakresie wyszukiwania, odpowiednią warunek testu będzie musiał być „to - vtr.początek () == 5 ”. Poniższy kod to ilustruje:

#włączać
#włączać
#włączać
#włączać
za pomocą przestrzeni nazw Std;
int main ()

VectorVtr = „Dog Rose”, „Honeysuckle”, „Enchanter's Nightshade”, „Columbine”, „Kingcup”, „Cornflower”, „Water Avens”, „Forget-me-not”;
wektor :: iterator it = znajdź (vtr.początek () + 1, vtr.end () - 3, „Cornflower”);
if (to == vtr.koniec())
Cout<< "Flower was not found!" <w przeciwnym razie if (to - vtr.begin () == 5)
if (*it == String („cornflower”))
Cout<< "Flower found at index: " << it - vtr.begin() <w przeciwnym razie
Cout<< "Flower was not found in range!" <
w przeciwnym razie
Cout<< "Flower found at index: " << it - vtr.begin() <
powrót 0;

Wyjście to:

Kwiat znaleziony na indeksie: 5

Więcej niż jedno zdarzenie

W poniższym programie „Cornflower” występuje w więcej niż jednym miejscu. Aby znaleźć wszystkie indeksy wystąpień, użyj pętli while, aby kontynuować wyszukiwanie, po poprzednim wystąpieniu, do końca (VTR.end ()) wektora. Program to:

#włączać
#włączać
#włączać
#włączać
za pomocą przestrzeni nazw Std;
int main ()

VectorVtr = „Dog Rose”, „Cornflower”, „Enchanter's Nightshade”, „Columbine”, „Kingcup”, „Cornflower”, „Water Avens”, „Cornflower”;
wektor :: iterator it = znajdź (vtr.początek (), vtr.end (), „Cornflower”);
While (to != vtr.koniec())
if (*it == String („cornflower”))
Cout<< "Flower found at index: " << it - vtr.begin() <it ++;

powrót 0;

Wyjście to:

Kwiat znaleziony na indeksie: 1
Kwiat znaleziony na indeksie: 5
Kwiat znaleziony na indeksie: 7

Znalezienie liczby całkowitej

Wektor może składać się z liczb całkowitych. Pierwszą wartość całkowitą można znaleźć za pomocą funkcji FINK () (z biblioteki algorytmu). Poniższy program ilustruje to:

#włączać
#włączać
#włączać
za pomocą przestrzeni nazw Std;
int main ()

VectorVtr = 1, 2, 3, 1, 2, 3, 1, 2, 3;
wektor :: iterator it = znajdź (vtr.początek (), vtr.end (), 3);
if (to == vtr.koniec())
Cout<< "Number was not found!" <w przeciwnym razie
Cout<< "Number found at index: " << it - vtr.begin() <powrót 0;

Wyjście to:

Liczba znaleziona na indeksie: 2
dla pierwszego wystąpienia wartości, 3.

Orzec

Inputiterator Find_if (inputiterator najpierw, Inputiterator Last, predykate pred);

Funkcja tutaj to Find_if (), a nie tylko znajdź (). Pred to nazwa funkcji, która podaje kryteria wyszukiwania. Ten trzeci argument przyjmuje tylko nazwę funkcji, bez argumentów i bez nawiasów. Jeśli funkcja predykatu przyjmuje argument, to w definicji funkcji podano parametry argumentów. Poniższy program ilustruje to, szukając pierwszej parzystej liczby na liście wektorów:

#włączać
#włączać
#włączać
za pomocą przestrzeni nazw Std;
bool fn (int n)
if ((n % 2) == 0)
zwrócić true;
w przeciwnym razie
zwrócić fałsz;

int main ()

vectorVtr = 1, 3, 5, 7, 8, 9, 10, 11, 12;
wektor :: iterator it = find_if (vtr.początek (), vtr.end (), fn);
if (to == vtr.koniec())
Cout<< "Number was not found!" <w przeciwnym razie
Cout<< "Number found at index: " << it - vtr.begin() <powrót 0;

Wyjście to:

Liczba znaleziona w indeksie: 4

Zauważ, że cały wektor został przeszukany z zakresem „VTR.początek (), vtr.koniec()".

Nazwa funkcji predykatu jest tutaj, fn. Wymaga jednego argumentu, n int. Gdy funkcja Find_if () zaczyna skanować wektor z pierwszego elementu, wywołuje funkcję predykatu z każdym numerem w wektorze jako argument. Skanowanie zatrzymuje się, gdy dotrze do pierwszego elementu w wektorze, w którym predykat powraca prawdziwie.

Wniosek

Funkcja FINK () w bibliotece algorytmu istnieje w czterech kategoriach, które są: Znajdź, znajdź koniec, znajdź pierwszy i sąsiednie znajdź. Tylko kategoria, znaleziono powyżej i w dużej mierze. Wyjaśnienie podane powyżej to podstawy wszystkich funkcji Find () w bibliotece algorytmu. FINK () Funkcje radzą sobie bezpośrednio z iteratorami i pośrednio z indeksami. Programator musi wiedzieć, jak przekonwertować iterator na indeks i ogólny arytmetyka iterator, jak pokazano powyżej.