2012-01-24 217 views
6

我試圖抹掉使用多集的最後一個元素:多集刪除最後一個元素

minheap.erase(minheap.rbegin());

它不編譯,並給出錯誤回報4-5。

請注意,在C++ multisets中,.end()指向最後一個元素旁邊,而不是最後一個元素。

任何想法?

編輯:

爲什麼這個提供不同的數字?

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

multiset <int>::iterator it2 = minheap.end(); 
m2=*(--it2); 
隨着在多集`M1增加了一些數據是1`和`m2是2`。爲什麼這些不一樣?
+0

關於你的編輯:你不需要'++ it1','rbegin'已經指向最後一個元素。 –

+0

哦,你說得對,對不起,對我來說已經遲到了:D – Cristy

回答

14

擦除函數必須將常規迭代器作爲參數。爲了得到這樣一個迭代器,你可以嘗試調用

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

這就要求結束()獲得一個迭代結束,然後備份它使用新的C++ 11分組功能的一個步驟。如果你沒有C++ 11的支持,則可以選擇寫

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

或者,因爲它看起來像你想使用多重映射爲最小堆,你有沒有考慮,而不是使用priority_queue或像push_heap和pop_heap這樣的堆算法?

編輯:要回答你的後續問題,那你在這裏得到兩個不同的值的原因在於邏輯,rbegin指向multimap中的最後一個元素,而不是一步到位之前,而終點一個結束。備份結束一步它引用與rbegin相同的元素,所以如果你正在向前推進rbegin一步,它將最終指向最後一個元素之前一步的元素。

希望這會有所幫助!

+0

現代人可能會寫'std :: prev(minheap.end())',我想...... –

+0

@ KerrekSB-哇!太棒了!我需要開始閱讀C++ 11中的更改​​。 :-) – templatetypedef

+0

查看我的更新請:D。而且,也不是「--minheap.end()」也改變存儲在minheap.end()(減少它)的值嗎? – Cristy

相關問題