2012-06-06 234 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