2013-01-04 27 views

Trả lời

13

Chúng sẽ có hiệu suất tương đương. Bạn nên sử dụng thuật toán thể hiện rõ nhất những gì bạn đang cố gắng làm.

Để xây dựng trên đó, thông thường, count() sẽ được triển khai bằng cách sử dụng find(). Ví dụ, trong libcxx, count() được thực hiện như return (find(__k) != end());

1

Tôi nghĩ rằng Tìm là tùy chọn tốt nhất ở đây, không cần phải tiến xa hơn nữa.

http://www.cplusplus.com/reference/unordered_map/unordered_map/find/

+3

'unordered_map' biết nó có các khóa duy nhất, do đó,' count() 'sẽ dừng trên kết quả khớp đầu tiên (trừ khi triển khai bị hỏng, nhưng bạn nên giả sử nó không phải là) –

1

find()count() được áp dụng cho nhiều container trong C++.

Đối với bản đồ, bộ vv tìm sẽ luôn có thời gian thực hiện liên tục, vì nó chỉ tính giá trị băm và trả về trình lặp cho phần tử đầu tiên được tìm thấy (end() nếu không tìm thấy).

count() mặt khác, có thời gian thực hiện không đổi O (e), trong đó e là số lần khóa được cung cấp được tìm thấy. Trường hợp xấu nhất là một bộ sưu tập mà tất cả các thành viên đều giống nhau, vì vậy count có thể có độ phức tạp O (n)

map hoặc unordered_map không cho phép trùng lặp, do đó thời gian chạy tiệm cận của chúng sẽ giống nhau.

Lựa chọn phụ thuộc vào ngữ nghĩa trong mã của bạn. Nếu bạn chỉ muốn kiểm tra xem khóa có tồn tại hay không, bạn chỉ có thể sử dụng count. Nếu bạn muốn kiểm tra xem khóa có tồn tại hay không và sử dụng giá trị của khóa đó, hãy truy cập find vì bạn sẽ có một trình vòng lặp trỏ đến phần tử đó.

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