2010-07-05 13 views
6

Tengo el siguiente código.Problemas con remove_if en VS2010 al usar conjuntos

#include <set> 
#include <algorithm> 

using namespace std; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
typedef set<long> MySet; 

MySet a; 

for(int i = 0; i < 10; ++i) 
{ 
    a.insert(i); 
} 

MySet::iterator start,end,last; 

start = a.begin(); 
end = a.end(); 

last = remove_if(start,end,bind2nd(less_equal<long>(),5)); 

return 0; 
} 

Que bajo VS2005 solía compilar bien. Sin embargo, utilizando VS2010 me sale el siguiente error:

error C3892 1 error: '_Next': no ​​se puede asignar a una variable que es const c: \ archivos de programa \ Microsoft Visual Studio 10.0 \ VC \ include \ algoritmo

Si hago del contenedor un vector, todo está bien.

Supongo que algo ha cambiado en el estándar que no conozco, ¿alguien puede arrojar algo de luz sobre por qué esto ya no funciona?

Respuesta

6

A std::set siempre mantiene sus elementos ordenados. std::remove_if intenta mover los elementos que no desea eliminar al principio de la colección. Esto violaría la constante del conjunto de mantener los elementos en orden ordenado.

El código nunca debería haber funcionado. Es posible que los compiladores más antiguos no hayan aplicado las reglas lo suficientemente estrictamente como para hacerle saber que se suponía que no funcionaba, pero (al parecer) su versión actual sí lo hace.

+0

Supongo que es obvio cuando lo piensas. He estado convirtiendo un proyecto masivo, que hemos arrastrado de vc6 a vs2005 y ahora a vs2010, y tengo muchos pequeños errores. Gracias por eliminar mi bloque de código mental. Pensé que vs2005 era bastante estricto, supongo que no tan estricto como vs2010. – Rich

+0

¿Tiene una solución para esto? ¿Hay algo que pueda usar en lugar de eliminar_if? – julienln

+2

@julienln: puede usar 'std :: remove_copy_if' para crear un contenedor nuevo sin los elementos que no desea, o puede buscar y borrar elementos individualmente. –

Cuestiones relacionadas