Cómo utilizar set_intersection con std :: set en VC ++?
-
01-10-2019 - |
Pregunta
Estoy intentando compilar proyecto VC6 con VC10 ... Obtengo un error C2678 con set_intersection: Escribí algunos ejemplos de entender. ¿Alguien puede explicar cómo compilar esta fragmentos?
#include <vector>
#include <algorithm>
#include <iostream>
#include <set>
#include <string>
int main( )
{
using namespace std;
typedef set<string> MyType;
MyType in1, in2, out;
MyType::iterator out_iter(out.begin());
set_intersection(in1.begin(),in1.end(), in2.begin(), in2.end(), out_iter);
}
La salida:
c: \ archivos de programa \ Microsoft Visual \ estudio 10,0 \ VC \ include \ algoritmo (4494): C2678 de error: '=' binario: no definido por el operador que tiene una mano izquierda operando de tipo 'const std :: basic_string <_Elem, _Traits, _Ax>'(o no hay conversión aceptable)
Si uso un std::vector
en lugar de std::set
la compilación tuvo éxito.
aceptable)
Solución
Trate
set_intersection(in1.begin(),in1.end(), in2.begin(), in2.end(), inserter(out, out.begin()) );
Esto se debe a set_intersection quiere escribir en el iterador de salida, lo que hace que el contenedor de salida a crecer en tamaño. Sin embargo, esto no se podía hacer con sólo un iterador solo (se podría utilizar para sobrescribir los elementos existentes, pero no crecen en tamaño)
Editar: arreglado el error tipográfico. Uso de inserción para añadir a un conjunto. Un back_inserter sólo funciona para los vectores y tal.
Editar 2: fija otro error tipográfico. inserter
STL requiere un segundo argumento que es un iterador de pista para la posición de inserción probable. Gracias chepseskaf.