2013-10-06 17 views
16

Jak mogę sprawdzić, czy moja tablica ma element, którego szukam?Sprawdź, czy element znaleziony w tablicy C++

W Javie, chciałbym zrobić coś takiego:

Foo someObject = new Foo(someParameter); 
Foo foo; 
//search through Foo[] arr 
for(int i = 0; i < arr.length; i++){ 
    if arr[i].equals(someObject) 
    foo = arr[i]; 
} 
if (foo == null) 
    System.out.println("Not found!"); 
else 
    System.out.println("Found!"); 

Ale w C++ nie sądzę wolno mi szukać, jeśli obiekt jest null więc co byłoby rozwiązaniem C++?

Odpowiedz

36

W C++ byłoby użyć std::find, i sprawdzić, czy uzyskanych punktów wskaźnik do końca zakresu, tak:

Foo array[10]; 
... // Init the array here 
Foo *foo = std::find(std::begin(array), std::end(array), someObject); 
// When the element is not found, std::find returns the end of the range 
if (foo != std::end(array)) { 
    cerr << "Found at position " << std::distance(array, foo) << endl; 
} else { 
    cerr << "Not found" << endl; 
} 
+1

Skąd pochodzi '10'? –

+1

@JamesMcMahon To arbitralny numer, który wybrałem dla rozmiaru tablicy w moim przykładzie. – dasblinkenlight

+0

Ponieważ jest to używane jako duplikat celu, a C++ 11 ma teraz 5 lat, rozważ zastąpienie 'tablica + 10' przez' std :: end (array) '? – Yakk

-4

C++ ma wartość NULL, a także, często tak samo jak 0 (wskaźnik do rozwiązania 0x00000000).

Do you use NULL or 0 (zero) for pointers in C++?

Więc w C++ tej kontroli zerowej byłoby:

if (!foo) 
    cout << "not found"; 
+0

Kiedy próbuję tego w ten sposób, mówi, że "operator" nie został znaleziony dla mojego obiektu. –

+0

Lub możesz spróbować (foo == NULL) – canhazbits

3

byłoby po prostu zrobić to samo, pętli w tablicy, aby szukać terminu chcesz. Oczywiście jeśli jest to posortowanej tablicy byłoby to znacznie szybciej, więc coś podobnego do prehaps:

for(int i = 0; i < arraySize; i++){ 
    if(array[i] == itemToFind){ 
     break; 
    } 
} 
6

Istnieje wiele sposobów ... jeden jest użycie algorytmu std::find(), np

#include <algorithm> 

int myArray[] = { 3, 2, 1, 0, 1, 2, 3 }; 
size_t myArraySize = sizeof(myArray)/sizeof(int); 
int *end = myArray + myArraySize; 
// find the value 0: 
int *result = std::find(myArray, end, 0); 
if (result != end) { 
    // found value at "result" pointer location... 
} 
2

Możesz użyć starego programowania w stylu C, aby wykonać zadanie. Będzie to wymagało niewielkiej wiedzy o C++. Dobry dla początkujących.

dla współczesnego języka C++ zwykle tego dokonać przez lambda, obiektów funkcyjnych ... lub algorytmu: find, find_if, any_of, for_each lub nowej składni for (auto& v : container) { }. Algorytm klasy find pobiera więcej linii kodu. Możesz także napisać własną funkcję szablonu find dla twoich szczególnych potrzeb.

Oto mój przykładowy kod

#include <iostream> 
#include <functional> 
#include <algorithm> 
#include <vector> 

using namespace std; 

/** 
* This is old C-like style. It is mostly gong from 
* modern C++ programming. You can still use this 
* since you need to know very little about C++. 
* @param storeSize you have to know the size of store 
* How many elements are in the array. 
* @return the index of the element in the array, 
* if not found return -1 
*/ 
int in_array(const int store[], const int storeSize, const int query) { 
    for (size_t i=0; i<storeSize; ++i) { 
     if (store[i] == query) { 
     return i; 
     } 
    } 
    return -1; 
} 

void testfind() { 
    int iarr[] = { 3, 6, 8, 33, 77, 63, 7, 11 }; 

    // for beginners, it is good to practice a looping method 
    int query = 7; 
    if (in_array(iarr, 8, query) != -1) { 
     cout << query << " is in the array\n"; 
    } 

    // using vector or list, ... any container in C++ 
    vector<int> vecint{ 3, 6, 8, 33, 77, 63, 7, 11 }; 
    auto it=find(vecint.begin(), vecint.end(), query); 
    cout << "using find()\n"; 
    if (it != vecint.end()) { 
     cout << "found " << query << " in the container\n"; 
    } 
    else { 
     cout << "your query: " << query << " is not inside the container\n"; 
    } 

    using namespace std::placeholders; 
    // here the query variable is bound to the `equal_to` function 
    // object (defined in std) 
    cout << "using any_of\n"; 
    if (any_of(vecint.begin(), vecint.end(), bind(equal_to<int>(), _1, query))) { 
     cout << "found " << query << " in the container\n"; 
    } 
    else { 
     cout << "your query: " << query << " is not inside the container\n"; 
    } 

    // using lambda, here I am capturing the query variable 
    // into the lambda function 
    cout << "using any_of with lambda:\n"; 
    if (any_of(vecint.begin(), vecint.end(), 
      [query](int val)->bool{ return val==query; })) { 
     cout << "found " << query << " in the container\n"; 
    } 
    else { 
     cout << "your query: " << query << " is not inside the container\n"; 
    } 
} 

int main(int argc, char* argv[]) { 
    testfind(); 

    return 0; 
} 

Say ten plik nosi nazwę 'testalgorithm.cpp' trzeba go skompilować z

g++ -std=c++11 -o testalgorithm testalgorithm.cpp 

nadzieję, że to pomoże. Zaktualizuj lub dodaj, jeśli popełniłem jakiś błąd.

1

Jeśli były pierwotnie szuka odpowiedzi na this question (int value in sorted (Ascending) int array), można użyć następującego kodu, który wykonuje wyszukiwania binarnego (najszybszy wynik):

static inline bool exists(int ints[], int size, int k) // array, array's size, searched value 
{ 
    if (size <= 0)  // check that array size is not null or negative 
     return false; 
    // sort(ints, ints + size); // uncomment this line if array wasn't previously sorted 
    return (std::binary_search(ints, ints + size, k)); 
} 

edit: działa również dla niesegregowanych int tablicy jeśli odkomentowanie sort .

Powiązane problemy