6

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

しかし、価値観の深いコピーを使用して、これを行うためのより簡潔でエレガントな方法を見つけてください。

4

1 に答える 1

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を使用できない場合は、関数オブジェクトを使用できます。

于 2012-06-06T16:07:06.530 に答える