2010-08-10 36 views
175

thể trùng lặp:
How to find an item in a std::vector?kiểm tra xem std :: vector có chứa một đối tượng nhất định không?

Có cái gì đó trong <algorithm> cho phép bạn kiểm tra xem một std :: chứa chứa một cái gì đó? Hoặc, một cách để tạo một ví dụ:

if(a.x == b.x && a.y == b.y) 
return true; 

return false; 

Chỉ có thể thực hiện với std::map vì nó có sử dụng khóa không?

Cảm ơn

+6

std :: find ...... – sje397

+0

Nếu nó chứa một cái gì đó cụ thể, hoặc chỉ của nó không có sản phẩm nào? –

+2

Bạn đang sử dụng tham chiếu C++ nào? Và tiêu đề được gọi là ' '- lưu ý số .h. –

Trả lời

355

Kiểm tra nếu v chứa các yếu tố x:

#include <algorithm> 

if(std::find(v.begin(), v.end(), x) != v.end()) { 
    /* v contains x */ 
} else { 
    /* v does not contain x */ 
} 

Kiểm tra nếu v chứa các yếu tố (không bị để trống):

if(!v.empty()){ 
    /* v is non-empty */ 
} else { 
    /* v is empty */ 
} 
+13

Nếu x là phần tử cuối cùng trong v thì sao? –

+52

David, end() trỏ đến một trong quá khứ yếu tố cuối cùng, vì vậy tất cả các công trình ra. –

+2

Tài khoản này có dung sai số khi cố gắng xác định liệu một đôi có trong vectơ không? –

9

Xem câu hỏi: How to find an item in a std::vector?

Bạn cũng sẽ cần phải đảm bảo bạn đã triển khai phù hợp operator==() cho đối tượng của bạn, nếu một người mặc định là không đủ cho một thử nghiệm "sâu" bình đẳng .

73

Nếu tìm kiếm một yếu tố rất quan trọng, tôi khuyên bạn nên std::set thay vì std::vector. (. Tức là myset.find(x)): Sử dụng này

std::find(vec.begin(), vec.end(), x) chạy trong thời gian O (n) thời gian, nhưng std::setfind() thành viên riêng của mình mà chạy trong thời gian O (log n) thời gian - đó là hiệu quả hơn với số lượng lớn của các yếu tố

std::set cũng đảm bảo tất cả các yếu tố được thêm vào là duy nhất, giúp bạn không phải làm bất cứ điều gì như if not contained then push_back()....

+1

Tuyệt vời !!! Tôi đang viết lexer. Bộ sẽ tốt hơn nhiều so với vectơ. 'Set' có phương thức' count' như 'map' không? Tôi cũng muốn có thể lấy chỉ mục của phần tử trong một tập hợp. – IAbstract

+1

Thông tin tuyệt vời! Cảm ơn bạn đã trả lời câu hỏi thẳng và cung cấp giải pháp bổ sung. – CodeMouse92

+3

Đây là lời khuyên không tốt. Nếu hiệu suất là quan trọng, hồ sơ. Không có gì đảm bảo rằng phân tích phức tạp có bất cứ điều gì để nói về vấn đề cụ thể của bạn. –

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