2012-06-06 22 views
5

E 'possibile con un algoritmo STL copiare in profondità i valori di std :: map in un file std :: set?Copia std :: map in std :: set in C++

Non voglio inserire esplicitamente nel nuovo set.

ho non lo fanno vuole fare in modo esplicito questo:

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); 
} 

ma trovare una più concisa e modo elegante per fare questo, con una copia completa di valori.

+0

Aggiungere un codice. Stai cercando di copiare 'key_type' di' map' o 'value_type'? – dirkgently

+1

Cosa succede se ci sono duplicati? Dovresti invece usare un "multiset"? –

+0

Non ci saranno duplicati, e se ci sono, non è importante. – linello

risposta

8

Che dire di questo?

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

Questo copia solo i puntatori, però. Se si desidera una profonda-copy, allora si avrebbe bisogno di fare:

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

BTW, il codice utilizza le funzioni lambda (solo da C++ 11). Se non puoi usare C++ 11, potresti usare uno function object, però.

Problemi correlati