loại này so sánh được gọi là một lexicographical ordering và là một trong những cách tự nhiên hơn để kết hợp hai thứ tự khác nhau thành một.
Các yêu cầu được yêu cầu trong C++ được gọi là strict weak orderings. Điều này có nghĩa rằng những điều sau đây phải được sự thật:
- Irreflexivity: x < x luôn luôn là sai.
- Độ nhạy: Nếu x < y và y < z, sau đó x < z.
- Tính không đối xứng: Nếu x < y, thì y < x luôn luôn là sai.
- Độ tương đương của tương đương: Nếu x và y là không thể so sánh và y và z là không thể so sánh, thì x và z là không thể so sánh.
Thuộc tính này là những gì bạn cần để đảm bảo rằng bạn có thể lấy danh sách đối tượng và đưa chúng vào thứ tự tăng dần được sắp xếp. Điều này có nghĩa là bạn có thể sử dụng std::sort
trên chúng hoặc lưu trữ chúng trong std::set
.
Bạn có thể chứng minh bằng một chút toán học nếu bạn có hai thứ tự yếu khác nhau nghiêm ngặt, thì thứ tự từ vựng bạn nhận được bằng cách kết hợp chúng là std::pair
cũng là thứ tự yếu. Thứ tự từ điển là một trong số ít cách mà bạn có thể kết hợp các thứ tự yếu kém để thực hiện các trật tự yếu nghiêm ngặt mới.
Tuy nhiên, thứ tự mà bạn đã đề xuất là không phải đặt hàng yếu kém nghiêm ngặt và sẽ khiến một số giả định nhất định vi phạm. Đặc biệt, hãy xem xét các cặp (0, 5), (3, 3) và (1, 6). Sau đó (0, 5) là không thể so sánh với (3, 3) và (3, 3) là không thể so sánh với (1, 6). Tuy nhiên, chúng tôi thực sự có điều đó (0, 5) < (1, 6), vi phạm quy tắc transitivity tương đương. Kết quả là, nhiều thuật toán sắp xếp giả định rằng tương đương là transitive (bao gồm hầu hết các thuật toán sắp xếp chính) sẽ không hoạt động chính xác trên phạm vi của bạn, nghĩa là std::sort
có thể hoạt động không chính xác. Nó cũng có nghĩa là bạn cũng không thể lưu trữ chúng trong một std::set
, bởi vì các std::set
interally lưu trữ tất cả mọi thứ trong một số loại thứ tự sắp xếp (thường là một cây tìm kiếm nhị phân cân bằng) và bạn có thể nhận được kết quả hoàn toàn sai.
Hy vọng điều này sẽ hữu ích!
Giải thích chính xác tôi đang tìm kiếm (+1) – Samaursa