Скопируйте std::map в std::set в С++

Возможно ли с помощью алгоритма STL глубоко скопировать значения std::map в 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);
}

но найдите более точный и элегантный способ сделать это с глубокой копией значений.


person linello    schedule 06.06.2012    source источник
comment
Добавьте немного кода. Вы пытаетесь скопировать map key_type или value_type?   -  person dirkgently    schedule 06.06.2012
comment
Что делать, если есть дубликаты? Должны ли вы использовать multiset вместо этого?   -  person Oliver Charlesworth    schedule 06.06.2012
comment
Дубликатов не будет, а если и будут, то не важно.   -  person linello    schedule 06.06.2012
comment
Вы можете использовать select2nd из STL SGI или из предыдущего ответа.   -  person Jerry Coffin    schedule 06.06.2012
comment
Или используйте итератор преобразования, который извлекает ключ или значение карты. Я предоставил несколько реализаций ключевого итератора в ответе на другой вопрос. Преобразование любого из них в итератор значений было бы тривиальной задачей. Когда вы говорите, что вам нужна глубокая копия, на самом деле вам следует обернуть указатель в класс дескриптора, который выполняет глубокую копию при копировании.   -  person James McNellis    schedule 07.06.2012


Ответы (1)


Что насчет этого?

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, вы можете использовать объект-функцию. , хоть.

person betabandido    schedule 06.06.2012