2012-01-24 37 views
6

Tôi cố gắng để xóa các yếu tố cuối cùng của một MultiSet sử dụng:MultiSet xóa yếu tố cuối cùng

minheap.erase(minheap.rbegin());

Nó không biên dịch, và cung cấp cho 4-5 erros.

Lưu ý rằng trong C++ multisets, .end() điểm bên cạnh phần tử cuối cùng và không ở phần tử cuối cùng.

Bất kỳ ý tưởng nào?

EDIT:

Tại sao này cung cấp các số khác nhau?

multiset <int>::reverse_iterator it1 = minheap.rbegin(); 
m1=*(++it1); 

multiset <int>::iterator it2 = minheap.end(); 
m2=*(--it2); 
Với một số dữ liệu thêm vào trong MultiSet 'm1 là 1` và' m2 là 2`. Tại sao không giống nhau?
+0

Về chỉnh sửa của bạn: bạn không cần '++ it1',' rbegin' đã trỏ đến phần tử cuối cùng. –

+0

Ồ, bạn nói đúng, xin lỗi, đã muộn với tôi: D – Cristy

Trả lời

14

Chức năng xóa phải lấy một trình lặp thường xuyên làm đối số. Để có một trình lặp như vậy, bạn có thể thử gọi

minheap.erase(std::prev(minheap.end())); 

Lệnh gọi này kết thúc một bước bằng cách sử dụng hàm C++ 11 mới. Nếu bạn không có hỗ trợ C++ 11, bạn có thể lựa chọn viết

minheap.erase(--minheap.end()); 

Ngoài ra, vì nó có vẻ như bạn đang cố gắng sử dụng Multimap như một min-heap, có bạn xem là thay vì sử dụng priority_queue hoặc các thuật toán heap như push_heap và pop_heap?

EDIT: Để trả lời câu hỏi tiếp theo của bạn, lý do mà bạn đang nhận được hai giá trị khác nhau ở đây là điểm logic, rbegin tới phần tử cuối cùng của Multimap, không phải là một bước trước đó, trong khi điểm cuối một quá khứ. Sao lưu kết thúc bằng một bước có tham chiếu đến phần tử giống như rbegin, vì vậy nếu bạn sau đó tiến tới rbegin về phía trước một bước, nó sẽ kết thúc trỏ đến phần tử một bước trước phần tử cuối cùng.

Hy vọng điều này sẽ hữu ích!

+0

Người hiện đại có thể viết 'std :: prev (minheap.end())', tôi giả sử ... –

+0

@ KerrekSB- Whoa! Điều đó thật tuyệt! Tôi cần bắt đầu đọc qua các thay đổi trong C++ 11. :-) – templatetypedef

+0

Xem cập nhật của tôi, vui lòng: D. Và ngoài ra, không phải là "--minheap.end()" cũng thay đổi giá trị được lưu trữ tại minheap.end() (decrementing it)? – Cristy

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