2012-06-06 18 views
5

¿Es posible con un algoritmo de copia profunda STL un std :: mapa valores a un std :: set?Copia std :: mapa para std :: encuentra en C++

no quiero insertar de forma explícita en el nuevo conjunto.

I No quieren hacer esto explícitamente:

std::map<int, double*> myMap; //filled with something 
std::set<double*> mySet; 

for (std::map<int, double*>::iterator iter = myMap.begin(); iter!=myMap.end(); ++iter) 
{ 
    mySet.insert(iter->second); 
} 

pero encuentra una más coincise y elegante manera de hacer esto, con una copia profunda de los valores.

+0

Agregue un código. ¿Estás tratando de copiar el 'map''s' key_type' o el 'value_type'? – dirkgently

+1

¿Qué pasa si hay duplicados? ¿Deberías usar un 'multiset' en su lugar? –

+0

No habrá duplicados, y si los hay, no son importantes. – linello

Respuesta

8

¿Qué tal esto?

std::transform(myMap.begin(), myMap.end(), std::inserter(mySet, mySet.begin()), 
    [](const std::pair<int, double*>& key_value) { 
     return key_value.second; 
    }); 

Esto sólo copia los punteros, sin embargo. Si desea una copia profunda, entonces usted tendría que hacer:

std::transform(myMap.begin(), myMap.end(), std::inserter(mySet, mySet.begin()), 
    [](const std::pair<int, double*>& key_value) { 
     return new double(*key_value.second); 
    }); 

Por cierto, el código utiliza las funciones lambda (sólo disponible en C++ 11). Si no puede usar C++ 11, puede usar un function object, sin embargo.