2012-01-24 8 views
6

Sto cercando di cancellare l'ultimo elemento di una multiset utilizzando:Multiset cancellare ultimo elemento

minheap.erase(minheap.rbegin());

E non compila e dà 4-5 erros.

Si noti che in multiset C++, .end() punti accanto all'ultimo elemento e non all'ultimo elemento.

Qualche idea?

EDIT:

Perché sono questo fornendo numeri diversi?

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

multiset <int>::iterator it2 = minheap.end(); 
m2=*(--it2); 
Con alcuni dati aggiunti nel multiset `M1 è 1` e` m2 è 2`. Perché non sono tutti uguali?
+0

Per quanto riguarda la modifica: non è necessario '++ it1',' rbegin' sta già puntando all'ultimo elemento. –

+0

Oh, hai ragione, mi dispiace, mi sta facendo tardi: D – Cristy

risposta

14

La funzione di cancellazione deve eseguire un iteratore normale come argomento. Per ottenere un tale iteratore, si potrebbe provare a chiamare

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

Ciò richiede end() per ottenere un iteratore fino alla fine, poi esegue il backup un passo utilizzando la nuova funzione prev C++ 11. Se non si dispone di C++ 11 di supporto, in alternativa è possibile scrivere

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

In alternativa, in quanto sembra che si sta cercando di utilizzare la multimap come un min-heap, avete considerato utilizzando invece priority_queue o gli algoritmi di heap come push_heap e pop_heap?

EDIT: Per rispondere alla domanda di follow-up, il motivo che stai ricevendo due diversi valori qui è che i punti logicamente, rbegin per l'ultimo elemento del multimap, non un passo prima di esso, mentre i punti finali uno dopo la fine. Il backup di un passo fa riferimento allo stesso elemento di rbegin, quindi se stai avanzando rbegin in avanti di un passo finirà per puntare all'elemento un passo prima dell'ultimo elemento.

Spero che questo aiuti!

+0

Le persone moderne potrebbero scrivere 'std :: prev (minheap.end())', suppongo ... –

+0

@ KerrekSB- Whoa! È davvero fantastico! Ho bisogno di iniziare a leggere le modifiche in C++ 11. :-) – templatetypedef

+0

Vedere il mio aggiornamento per favore: D. Inoltre, non è "--minheap.end()" che modifica anche il valore archiviato in minheap.end() (decrementandolo)? – Cristy