2012-06-06 17 views
5

Ist es mit einem STL-Algorithmus möglich, std :: map-Werte tief in ein std :: set zu kopieren?Kopiere std :: map zu std :: setze in C++

Ich möchte nicht explizit in den neuen Satz einfügen.

ich nicht will dies ausdrücklich tun:

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

aber eine coincise und elegante Art und Weise, dies zu tun, mit einer tiefen Kopie von Werten finden.

+0

Fügen Sie einen Code hinzu. Versuchen Sie, den 'key_type' der Karte oder den' value_type' zu ​​kopieren? – dirkgently

+1

Was ist, wenn es Duplikate gibt? Solltest du stattdessen eine Multiset verwenden? –

+0

Es wird keine Duplikate geben, und wenn es solche gibt, ist das nicht wichtig. – linello

Antwort

8

Was ist damit?

std::transform(myMap.begin(), myMap.end(), std::inserter(mySet, mySet.begin()), 
    [](const std::pair<int, double*>& key_value) { 
     return key_value.second; 
    }); 

Dies kopiert jedoch nur die Zeiger. Wenn Sie eine tief Kopie wollen, dann würden Sie tun müssen:

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, der Code Lambda-Funktionen verwendet (nur verfügbar, von C++ 11). Wenn Sie C++ 11 nicht verwenden können, könnten Sie jedoch eine function object verwenden.

Verwandte Themen