2013-10-10 15 views
13

Na przykład mam tej tablicy:Jak mogę sprawdzić, czy podane int istnieje w tablicy?

int myArray[] = { 3, 6, 8, 33 }; 

Jak sprawdzić, czy dana zmienna x jest w nim?

Czy muszę napisać własną funkcję i zapętlić tablicę, czy też istnieje w nowoczesnym C++ równoważnym z in_array w PHP?

+1

Spójrz na przykład na [ 'std :: find'] (http://www.cplusplus.com/reference/algorithm/find/). – DCoder

Odpowiedz

25

Można użyć std::find na to:

#include <algorithm> // for std::find 
#include <iterator> // for std::begin, std::end 

int main() 
{ 
    int a[] = {3, 6, 8, 33}; 
    int x = 8; 
    bool exists = std::find(std::begin(a), std::end(a), x) != std::end(a); 
} 

std::find zwraca iterator do pierwszego wystąpienia x lub iterator do jednego poza końcem zakresie jeśli x nie znaleziono.

+2

Lub po prostu: 'bool exists = std :: any_of (std :: begin (tablica), std :: end (array), [&] (int i) {return i == x;});' –

+2

'std :: find' jest dobre, jeśli nie używasz C++ 11. Następnie znowu 'std: begin' i' std: end' są tylko w C++ 11. –

11

myślę szukasz std::any_of, która zwróci true/false odpowiedź wykryć, czy element jest w pojemniku (array, wektorowe, deque, etc.)

int val = SOME_VALUE; // this is the value you are searching for 
bool exists = std::any_of(std::begin(myArray), std::end(myArray), [&](int i) 
{ 
    return i == val; 
}); 

Jeśli chcesz wiem, gdzie jest element, std::find zwróci iterator do pierwszego elementu pasującego do podanych kryteriów (lub predykatu, który je podasz).

int val = SOME_VALUE; 
int* pVal = std::find(std::begin(myArray), std::end(myArray), val); 
if (pVal == std::end(myArray)) 
{ 
    // not found 
} 
else 
{ 
    // found 
} 
-2

Musisz przejść przez nie. C++ nie implementuje prostszego sposobu, aby to zrobić, gdy mamy do czynienia z macierzami typu pierwotnego.

zobaczyć również tę odpowiedź: C++ check if element exists in array

+1

Tak, to robi - std :: find. Wciąż jest to pętla, ale pętla, która została już napisana. –

+0

Połączone pytanie zawiera nawet odpowiedź zawierającą std :: find_first_of ... – badgerr

+0

'std :: find',' std :: find_first_of', 'std :: any_of'. Wszystkie implementują pętle, ale język je dostarczył (więc nie trzeba pisać własnych). W C++ większość czasu rzadko będziesz musiał napisać własną pętlę. –

2

Prawie nigdy nie trzeba pisać własne pętle w języku C++. Tutaj możesz użyć std::find.

const int toFind = 42; 
int* found = std::find (myArray, std::end (myArray), toFind); 
if (found != std::end (myArray)) 
{ 
    std::cout << "Found.\n" 
} 
else 
{ 
    std::cout << "Not found.\n"; 
} 

std::end wymaga C++ 11. Bez niej można znaleźć liczbę elementów w tablicy z:

const size_t numElements = sizeof (myArray)/sizeof (myArray[0]); 

... i koniec z:

int* end = myArray + numElements; 
1
int index = std::distance(std::begin(myArray), std::find(begin(myArray), end(std::myArray), VALUE)); 

Zwraca nieprawidłowy indeks (długość tablicy) jeśli nie zostanie znaleziony.

2

Spróbuj

#include <iostream> 
#include <algorithm> 


int main() { 
    int myArray[] = { 3 ,6 ,8, 33 }; 
    int x = 8; 

    if (std::any_of(std::begin(myArray), std::end(myArray), [=](int n){return n == x;})) { 
     std::cout << "found match/" << std::endl; 
    } 

    return 0; 

}

Powiązane problemy