2013-03-21 32 views
22

std::map có phương thức insert có trình lặp "gợi ý" sẽ giảm thời gian chèn từ nhật ký (n) sang thời gian không đổi nếu gợi ý là chính xác. Nó khá rõ ràng như thế nào điều này sẽ làm việc, kể từ khi container chỉ có thể chắc chắn rằng mục mới được thêm vào có một phím đó là ít hơn so với gợi ý và có một khóa lớn hơn mục trước khi gợi ý. Nếu không, gợi ý là sai và nó thực hiện chèn bình thường.std :: unordered_map chèn với gợi ý

std::unordered_map cũng có một số insert tương tự với chức năng gợi ý. Điều gì, nếu có, gợi ý làm gì? Nó không rõ ràng với tôi như thế nào khác một "gợi ý" iterator có thể được sử dụng để tăng tốc độ chèn một bản đồ băm.

Nếu được sử dụng, gợi ý "thích hợp" là gì. Trong std::map, gợi ý thường được tìm thấy bằng cách gọi lower_bound trên bản đồ.

+12

Tôi nghĩ rằng quá tải gợi ý chỉ dành cho giao diện tương thích với 'std :: map' bình thường, vì bạn phải biết chính xác vị trí giá trị băm được chèn vào để làm bất kỳ điều gì hữu ích - có nghĩa là bạn cần phải tính đến tải trọng, các thùng, vv, về cơ bản tái tạo những gì 'unordered_map' thực hiện trong nội bộ. Ngoài ra, như bạn đã lưu ý, chèn được khấu hao O (1) anyways. – Xeo

+0

Vì vậy, để được rõ ràng, bạn đang nói rằng nó không làm bất cứ điều gì? Đó là những gì tôi đã đoán .. đó là chỉ cho khả năng tương thích. – pauld

Trả lời

14

Đây là sự cố tương thích giao diện. Về cơ bản, thiết kế được thực hiện xem xét giao diện của std::map.

Nói cách khác, đối với std::unordered_map, không khác biệt gợi ý được cung cấp hay không.

Thông tin bổ sung từ các ý kiến ​​ở đây:

Sự phù hợp giao diện là rất quan trọng bởi vì việc có thể để nhanh chóng/dễ dàng chuyển đổi giữa mapunordered_map cung cấp sự linh hoạt có giá trị của đau đớn chuyển từ hiệu suất thường là yếu tố quyết định trong chọn một cái khác.

+7

+1 Có, khả năng tương thích của giao diện rất quan trọng đối với mã chung (ví dụ: nơi vùng chứa là thông số mẫu: 'mẫu '). Việc có thể chuyển đổi nhanh chóng/dễ dàng giữa 'map' và' unordered_map' là rất quan trọng vì hiệu năng thường là yếu tố quyết định trong việc lựa chọn cái kia. –

+4

@HowardHinnant: như OP đã lưu ý, gợi ý thường thu được bằng cách gọi tới bản đồ :: lower_bound() và unordered_map không có phương thức này (cos là vô nghĩa đối với vùng chứa không có thứ tự). Điều này có nghĩa là khả năng tương thích giao diện vẫn không được cung cấp? –

+0

@AndyT: Có các giới hạn rõ ràng đối với khả năng tương thích của giao diện. Tuy nhiên 'find' và' equal_range' là các nguồn lặp khác có thể tìm thấy trong cả hai API. Nếu chuyển đổi qua lại là một mục tiêu quan trọng đối với bạn, bạn dính vào tập hợp con API chung. Ủy ban đã làm mọi thứ có thể để làm cho tập hợp con lớn như thực tế, chẳng hạn như cho phép bạn cung cấp một gợi ý vô dụng khi chèn vào một unordered_map. –

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