2012-06-06 278 views
5

使用STL算法將std :: map值複製到std :: set可能嗎?將std :: map複製到C++的std :: set

我不想在新集中顯式插入。

希望明確這樣做:

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

BTW,代碼使用lambda函數(只能從C++ 11)。但是,如果你不能使用C++ 11,你可以使用function object