2010-05-06 24 views

Trả lời

42

Chắc chắn, sử dụng một iterator

map<string,Car>::const_iterator it = cars.find(name); 
return it!=cars.end(); 
+5

Vì bạn không đột biến 'xe ô tô', tốt hơn nên lấy' const_iterator'. – kennytm

+0

điểm tốt. Chỉnh sửa .... – Tom

+0

Nhưng nếu 'ô tô' không phải là const,' cars.find (name) 'sẽ trả về một' iterator' mà phải được chuyển đổi thành 'const_iterator' và' cars.end() 'sẽ trả về một 'iterator' mà sau đó sẽ được chuyển đổi thành' const_iterator' khi so sánh với 'nó'. Tại sao lại chống lại nó; tại sao không chỉ sử dụng một 'iterator'? –

5
bool exists(const string& name) 
{ 
    return cars.find(name) != cars.end(); 
} 
+0

Đặt hàm 'const' nếu là thành viên? –

+1

Nếu đó là thành viên, thì có. –

70
return cars.find(name) != cars.end(); 
+0

Đây là câu trả lời tôi sẽ sử dụng! –

1
bool exists(const std::map<std::string, Car>& cars, const std::string& name) { 
    return cars.end() != cars.find(name); 
} 
+0

Tại sao không làm cho nó thậm chí chung chung hơn bằng cách làm cho nó một chức năng mẫu? Nhưng nó có lẽ sẽ không đáp ứng yêu cầu của sự thanh lịch nào tốt hơn .. – foraidt

+0

@mxp, xem giải pháp của tôi cho điều đó (http://stackoverflow.com/questions/2781899/how-to-find-whether-an-element-exists -in-stdmap/2782084 # 2782084). –

2

std::map::find(const key_type& x);

Nó trả map::end nếu mục không tồn tại.

21

Bạn cũng có thể sử dụng

bool exists(const string& name) { 
    return cars.count(name) != 0; 
} 
+0

'! = 0' tùy chọn. – Potatoswatter

+12

@Potatoswatter Nhưng làm cho nó rõ ràng chính xác những gì đang được thử nghiệm. Nó hoàn toàn là một vấn đề phong cách, nhưng tôi có xu hướng không dựa vào int tiềm ẩn để chuyển đổi bool. – KeithB

+4

@Potatoswatter: Việc so sánh rõ ràng sẽ ngăn chặn một cảnh báo VC++ ("cảnh báo hiệu suất: buộc số nguyên để bool");) – UncleBens

7

gì về:

template <typename KeyType, typename Collection> 
bool exists_in(Collection const& haystack, KeyType const& needle) { 
    return std::find(haystack.begin(), haystack.end(), needle) != haystack.end(); 
} 

template <typename K, typename V> 
bool exists_in(std::map<K,V> const& haystack, K const& needle) { 
    return haystack.find(needle) != haystack.end(); 
} 

Điều này làm cho exists_in làm việc với bất kỳ container tiêu chuẩn qua std::find và sử dụng một phiên bản đặc biệt cho std::map vì nó cung cấp một tìm kiếm thay thế hiệu quả hơn . Bạn có thể thêm chuyên môn bổ sung nếu cần thiết (ví dụ: đối với std::set và các loại khác).

+4

Vượt qua mọi thứ bằng tham chiếu const. – UncleBens

15

Ngoài các câu trả lời bằng trình lặp-Giá trị từ tìm() và so sánh với .end(), có một cách khác: map :: count.

Bạn có thể gọi bản đồ :: đếm (khóa) với một khóa cụ thể; nó sẽ trả lại bao nhiêu mục tồn tại cho khóa đã cho. Đối với các bản đồ có khóa duy nhất, kết quả sẽ là 0 hoặc 1. Vì multimap cũng tồn tại với cùng một giao diện, nên so sánh tốt hơn với! = 0 để tồn tại ở bên an toàn.

ví dụ của bạn, đó là

return (cars.count(name)>0); 

Những lợi thế tôi thấy là 1. ngắn mã, 2. Lợi ích từ bất cứ optimisations thư viện có thể áp dụng trong nội bộ, sử dụng chi tiết đại diện của mình.

0
#define itertype(v) typeof((v).begin()) 
itertype(cars) it = cars.find(name); 
return it != cars.end(); 
+0

Tại sao bạn không sử dụng 'tự động' thay vì macro này? 'auto it = cars.find (tên);' –

+0

Chào mừng bạn đến với SO. Câu trả lời này không thực sự thêm bất kỳ điều gì mới chưa được đề cập trong câu trả lời hiện có (cũ hơn nhiều). Cân nhắc xóa câu trả lời của bạn và có thể xem xét trả lời thay vì câu hỏi chưa có câu trả lời được chấp nhận. –

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