2012-06-06 57 views
5

std :: mapの値をstd :: setにディープコピーすることは可能ですか?std :: mapをstd :: setをC++にコピー

明示的に新しいセットに挿入したくありません。

私はは、明示的にこれを行うにはしたくない

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

が、これを行うために、よりcoinciseかつエレガントな方法を見つけ、値のディープコピーで。

+0

コードを追加してください。あなたは 'map'の' key_type'か 'value_type'をコピーしようとしていますか? – dirkgently

+1

重複がある場合はどうなりますか?代わりに 'multiset'を使用するべきですか? –

+0

重複はなく、存在する場合は重要ではありません。 – linello

答えて

8

これはどうですか?

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

これはポインタだけをコピーします。あなたは深いコピーをしたい場合、あなたは何をする必要があります:

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

ところで、コードは(C++ 11からのみ利用可能)ラムダ関数を使用しています。 C++ 11を使用できない場合は、function objectを使用することもできます。

関連する問題