2013-10-10 14 views
13

Ví dụ, tôi có mảng này:Làm cách nào để kiểm tra xem có tồn tại int trong mảng không?

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

Làm thế nào để kiểm tra nếu có biến x là trong nó?

Tôi có phải viết chức năng của riêng mình và lặp mảng đó hoặc có trong C++ hiện đại tương đương với in_array trong PHP không?

+1

Nhìn vào ví dụ cho [ 'std :: find'] (http://www.cplusplus.com/reference/algorithm/find/). – DCoder

Trả lời

25

Bạn có thể sử dụng std::find cho việc này:

#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 trả về một iterator để sự xuất hiện đầu tiên của x, hoặc một iterator tới một phần quá khứ cuối của dãy núi này nếu x không được tìm thấy.

+2

Hoặc đơn giản: 'bool tồn tại = std :: any_of (std :: bắt đầu (mảng), std :: end (mảng), [&] (int i) {return i == x;}); ' –

+2

' std :: find' là tốt đẹp nếu bạn không ở trên C++ 11. Sau đó, một lần nữa 'std: begin' và' std: end' là C++ 11 mà thôi. –

11

Tôi nghĩ rằng bạn đang tìm kiếm std::any_of, mà sẽ trả về một câu trả lời đúng/sai để phát hiện nếu một phần tử nằm trong một container (mảng, vector, deque vv)

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; 
}); 

Nếu bạn muốn biết nguyên tố ở đâu, std::find sẽ trả về một trình lặp cho phần tử đầu tiên khớp với bất kỳ tiêu chí nào bạn cung cấp (hoặc một biến vị ngữ mà bạn cung cấp).

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

Bạn cần lặp qua nó. C++ không thực hiện bất kỳ cách đơn giản nào để thực hiện điều này khi bạn đang xử lý các mảng kiểu nguyên thủy.

cũng thấy câu trả lời này: C++ check if element exists in array

+1

Có - std :: find. Nó vẫn là một vòng lặp cuối cùng, nhưng một vòng lặp đã được viết. –

+0

Câu hỏi được liên kết thậm chí có câu trả lời liên quan đến std :: find_first_of ... – badgerr

+0

'std :: find',' std :: find_first_of', 'std :: any_of'. Họ thực hiện tất cả các vòng, nhưng ngôn ngữ đã cung cấp cho bạn (vì vậy bạn không cần phải viết của riêng bạn). Trong C++, phần lớn thời gian bạn hiếm khi phải viết vòng lặp của riêng mình. –

2

Bạn hầu như không bao giờ phải viết vòng lặp của riêng bạn trong C++. Tại đây, bạn có thể sử dụng 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 yêu cầu C++ 11. Nếu không có nó, bạn có thể tìm số phần tử trong mảng với:

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

... và kết thúc với:

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

Trả về chỉ số hợp lệ (chiều dài của mảng) nếu không tìm thấy.

2

Hãy thử điều này

#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; 

}

Các vấn đề liên quan