2015-05-18 17 views
12

Các container kết hợp có thứ tự unordered_set, unordered_map vv không có ít hơn điều hành operator<, không phải là một hàm thành viên cũng không phải là một chức năng miễn phí. Tại sao? Không có chuyên môn nào của less. Các loại hash_* của SGI STL cũng thiếu tính năng này.Tại sao các vùng chứa liên kết không có thứ tự thực hiện toán tử nhỏ hơn?

Nếu chúng ta loại trừ khái niệm về loại cơ bản, tất cả các loại thùng chứa thực hiện các yêu cầu của các loại thường xuyên theo quy định ví dụ trong Stepanov & McJones' Các yếu tố của Lập trình. Ngoại lệ duy nhất là các loại liên kết không có thứ tự, thiếu operator<.


tôi không thể đưa ra một thực hiện hiệu quả của một nhà điều hành như vậy là phù hợp với định nghĩa được bình đẳng, vì vậy hiệu quả có thể là lý do? Mặt khác, operator== cho container kết hợp có thứ tự trong một số trường hợp cần phải rehash mọi phần tử của một container và nhìn nó lên trong khác - trung bình O (N), nhưng trường hợp tồi tệ nhất O (n ²).

+0

liên quan: [C++ 11: Có những lý do tại sao một số loại thông thường không nên có 'std :: băm 'chuyên ngành?] (http: // stackoverflow.com/q/29969322 /) – dyp

+0

Trong EoP, 'toán tử +' cũng được định nghĩa giữa các trình lặp và các số nguyên mà nó không phải là một hoạt động O (1). Ngoài ra, [Ghi chú về lập trình] (http://stepanovpapers.com/notes.pdf) có một nhận xét ở trang 28 cho thấy rằng hiệu quả không phải là lý do. – dyp

+4

Nếu các phần tử của thùng chứa là khái niệm 'không có thứ tự', làm cách nào bạn có thể so sánh hai thùng chứa đó một cách có ý nghĩa để xác định cái nào nên nhỏ hơn cái kia? – Galik

Trả lời

27

Về mặt lý thuyết nó không làm cho rất nhiều ý nghĩa. Hãy xem xét một túi bi màu khác nhau. Và giả sử bạn có hai túi bi:

  1. Chứa màu đỏ, xanh dương, xanh lục.
  2. Có màu tím, đỏ, vàng.

Túi 1 < túi 2?

Thậm chí nếu bạn kết hợp một để các màu sắc, nói:

red < yellow < purple < blue < green 

Nó vẫn còn khó khăn để nói nếu một túi nhỏ hơn so với người kia bởi vì trong nội bộ công ty liên kết túi không để các viên bi. Đó là túi 1 có thể được xuất ra trong bất kỳ 6 định dạng, mà tất cả đều tương đương:

  1. đỏ, xanh dương, xanh lá cây
  2. đỏ, xanh lá cây, xanh dương
  3. màu xanh, đỏ, xanh lá cây
  4. xanh, màu xanh lá cây, đỏ
  5. xanh, đỏ, xanh
  6. xanh lá, xanh, đỏ

Không có ở trên sáu là ít hơn bất kỳ o f khác. Thật vậy, tất cả đều bình đẳng, bất kể màu đỏ < màu xanh dương hoặc xanh dương < màu đỏ. Túi không phải là một chuỗi ... nó là một chuỗi không theo thứ tự.

Trong lịch sử các thùng chứa không có thứ tự cũng không có các toán tử bình đẳng. Tuy nhiên nó có ý nghĩa để hỏi nếu một túi chứa các viên bi cùng màu như túi khác. Và ở đây vấn đề là một trong những hiệu quả. Cuối cùng các thuật toán và kiến ​​nghị được trình bày để ép buộc ủy ban để thêm so sánh bình đẳng cho các container có thứ tự:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3068.pdf

+0

Vì vậy, ủy ban không tuân theo ý tưởng của Stepanov (mới?) Rằng các loại không có "tổng số tự nhiên đặt hàng "ít nhất phải có" tổng số đặt hàng mặc định "? Còn về con trỏ thì sao? (Hoặc có lẽ tôi đang bối rối vì thường xuyên ban đầu không yêu cầu LessThanComparable?) – dyp

+3

Không, ủy ban chưa bao giờ nói rằng tất cả các loại nên có một thứ tự tổng mặc định. Lịch sử này quay trở lại tất cả các cách để C++ 98 (tiêu chuẩn C++ đầu tiên). 'std :: complex' không có tổng số thứ tự. –

+0

Lưu ý rằng nếu ai đó nhấn mạnh vào việc so sánh giữa các thùng chứa băm 'L' và' R' có cùng 'Khóa' và' Hash', [có thể sử dụng] (http://stackoverflow.com/a/21688822/819272) 'std :: lexicographical_compare (bắt đầu (L), kết thúc (L), bắt đầu (R), kết thúc (R), [] (auto const & kL, auto const & kR) {return Hash() (kL) TemplateRex

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