Bộ chứa tiêu chuẩn và bộ điều hợp vùng chứa có ngữ nghĩa giá trị. Khi bạn đẩy một phần tử vào hàng đợi, một bản sao sẽ được tạo. Khi bạn loại bỏ một đối tượng khỏi hàng đợi, đối tượng đó sẽ bị hủy.
Thậm chí nếu top()
sẽ trả lại cho bạn một tham chiếu đến không const
, tham chiếu đó sẽ trở nên lúng túng ngay khi bạn xóa phần tử khỏi hàng đợi và hủy bỏ nó sẽ dẫn đến hành vi không xác định.
này cho biết, std::priority_queue
trả về cho bạn một tham chiếu đến const
để ngăn cản bạn rối tung (cố ý hoặc vô ý) với trật tự nội bộ của mình - đó là khá nhiều lý do tương tự tại sao chìa khóa của container kết hợp như std::map
và std::set
là const
.
gì bạn có thể làm, thay vào đó, là xây dựng một bản sao giá trị trả về bởi top()
, sửa đổi bản sao đó, loại bỏ bản gốc, và đẩy các bản sao vào hàng đợi:
SomeClass obj = pQueue.top();
pQueue.pop();
obj.setMember(42);
pQueue.push(std::move(obj)); // You can move obj into the queue if you no more need it
Nếu bạn cần ngữ nghĩa tham chiếu, mặt khác, bạn sẽ phải đẩy con trỏ vào hàng đợi (có thể là con trỏ thông minh, tùy thuộc vào trường hợp sử dụng của bạn) và cung cấp tiêu chí đặt hàng tùy chỉnh phù hợp. các đối tượng mà họ trỏ đến.
Trong trường hợp này, hãy cẩn thận không sửa đổi các thuộc tính đó trong thời gian chạy theo cách có thể làm cho thứ tự của chúng khác nhau. Điều đó được tính là "gây rối với thứ tự nội bộ của vùng chứa" và sẽ dẫn đến hành vi không xác định.
Nguồn
2013-05-25 23:20:57
@Bạn đã mắc lỗi khi ghi nhãn toàn bộ câu lệnh "hoàn thành BS". Đó là trớ trêu thay không chính xác cho gần như cùng một lý do mà bạn tấn công "nhảm nhí" chính nó. – sehe
@Ethouris: Hãy tránh sự xâm lược không cần thiết. Có nhiều cách thanh lịch hơn để không đồng ý. Quan điểm của tôi là (tôi đoán, đã 2,5 năm) rằng các yếu tố bị đẩy vào và lấy ra khỏi các thùng chứa chuẩn được sao chép, vì vậy những gì OP muốn làm (lấy một tham chiếu đến phần tử bên trong thùng chứa, loại bỏ phần tử, thực hiện) không hợp lệ - kết quả là UB. Điều đó áp dụng cho các hàng đợi ưu tiên giống như tất cả các vùng chứa khác bao gồm cả hàng bạn đề cập - 'hàng đợi'. Tôi không nói hàng đợi ưu tiên đặc biệt trong khía cạnh này. –
@Ethouris: Ngoài ra, lý do tại sao hàng đợi ưu tiên cung cấp tham chiếu đến const không có gì liên quan đến việc vô hiệu: như được giải thích trong câu trả lời, lý do là ngăn người dùng rối tung với tiêu chí đặt hàng bên trong. –