2012-06-06 3 views
5

Возможно ли с помощью STL-алгоритма скопировать значения std :: map в std :: set?Копировать std :: map to std :: set in 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

Добавить код. Вы пытаетесь скопировать '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, код использует лямбда-функции (доступные только с C++ 11). Если вы не можете использовать C++ 11, вы можете использовать function object.