2012-01-24 17 views
6

Estoy tratando de borrar el último elemento de un conjunto múltiple usando:Multiset borrar último elemento

minheap.erase(minheap.rbegin());

No compila y da erros 4-5.

Tenga en cuenta que en C++ multisectos, .end() apunta al lado del último elemento, y no al último elemento.

¿Alguna idea?

EDIT:

Por qué se esta proporcionando diferentes números?

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

multiset <int>::iterator it2 = minheap.end(); 
m2=*(--it2); 
con algunos datos adicionales en el conjunto múltiple `m1 es 1` y` m2 es 2`. ¿Por qué no son esos lo mismo?
+0

En cuanto a su edición: no necesita '++ it1',' rbegin' ya está apuntando al último elemento. –

+0

Oh, tienes razón, lo siento, se está haciendo tarde para mí: D – Cristy

Respuesta

14

La función de borrado debe tomar un iterador regular como argumento. Para obtener un iterador tal, usted podría intentar llamar

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

Esto exige final() para obtener un iterador hasta el final, y luego lo respalda un paso utilizando la nueva función prev C++ 11. Si usted no tiene soporte para C++ 11, se puede escribir alternativamente

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

alternativa, ya que parece que está tratando de utilizar el multimap como un min-montón, ¿ha considerado en lugar de utilizar o priority_queue los algoritmos de montón como push_heap y pop_heap?

EDITAR: Para responder a su pregunta de seguimiento, la razón por la que usted está recibiendo dos valores diferentes aquí es que los puntos lógicamente, rbegin hasta el último elemento de la multimap, ni un paso antes de que, mientras que los puntos finales uno pasado el final. Hacer una copia de seguridad en un paso hace que se refiera al mismo elemento que reiniciar, por lo que si avanza un paso hacia adelante, terminará apuntando al elemento un paso antes del último elemento.

Espero que esto ayude!

+0

La gente moderna podría escribir 'std :: prev (minheap.end())', supongo ... –

+0

@ KerrekSB- Whoa! ¡Eso es realmente genial! Necesito comenzar a leer los cambios en C++ 11. :-) – templatetypedef

+0

Ver mi actualización por favor: D. Y también, ¿no es "--minheap.end()" también cambiando el valor almacenado en minheap.end() (decrementándolo)? – Cristy

Cuestiones relacionadas