2012-04-27 15 views
14

Todos ustedes,Cómo obtener el primer elemento de un estándar :: conjunto

Encontré un error extraño en mi software.

Dentro de un bucle while, donde se quita elementos de un std :: set, quiero siempre dar el primer elemento hasta que el contenedor está vacío:

std::set< int*> nodes; 
// Fill nodes 
for (int i=0; i<10;i++) 
    nodes.insert(new int); 
// 
while (!nodes.empty()) 
{ 
int* pivot = (*nodes.begin()); 
// do some operation with pivot erasing some elements from nodes 
} 

He encontrado que la aplicación del primer elemento de esta manera las obras con gcc pero no con MSVC, se bloquea cuando intento desreferenciar el iterador (*nodes.begin()).

¿Las dos implementaciones de std :: set se comportan de manera diferente?

Me gustaría tener una estructura de datos sin diferencias de implementación, ¿es posible?

Probablemente hay que cambiar la estructura de datos para este tipo de operaciones

+0

¿Qué ocurre después de su desreferenciar? – Nick

+5

¿Qué es "hacer alguna operación con el pivote borrando algunos elementos de los nodos?" –

+4

solo desreferencia como este * (nodes.begin()) – v01d

Respuesta

2

su trabajo código bien en VS2010, mybe usted debe actualizar su VCC.

-3

No puede usar un iterador en un conjunto como este ya que la eliminación de un elemento del conjunto invalida el iterador. Cuando el tamaño del conjunto se encuentra por debajo de un cierto umbral (basado en el tamaño inicial cuando configura el iterador) modificará el almacenamiento subyacente de sus datos en el montón, lo que hará que el puntero que es su iterador apunte a la mierda.

Véase bajo el iterador validez: http://www.cplusplus.com/reference/set/set/erase/

(* nodes.begin()) hace lo que quiere, simplemente no puede eliminar de un set en su iteración a través de

Cuestiones relacionadas