2010-04-30 13 views
17

Ich möchte den Inhalt einer std :: map in eine andere kopieren. Kann ich std::copy dafür verwenden? Offensichtlich wird der folgende Code nicht:Wie kann ich mit std :: copy eine Karte in eine andere kopieren?

int main() { 
    typedef std::map<int,double> Map; 
    Map m1; 
    m1[3] = 0.3; 
    m1[5] = 0.5; 
    Map m2; 
    m2[1] = 0.1; 
    std::copy(m1.begin(), m1.end(), m2.begin()); 
    return 0; 
} 

Das wird nicht funktionieren, weil copyoperator* auf m2.begin() nennen wird „dereferenzieren“ es und einen Wert zuweisen (alle Werte sind vom Typ std::pair<const int, double>). Dann wird operator++ aufgerufen, um zum nächsten Leerzeichen in m2 zu wechseln. Diese beiden Operationen funktionieren nicht wegen der const in const int und es ist kein Platz für neue Elemente reserviert.

Gibt es eine Möglichkeit, es mit std::copy arbeiten zu lassen?

Danke!

Antwort

59

Sie können GMans Antwort --- aber die Frage ist, warum möchten Sie std::copy verwenden? Sie sollten stattdessen die Elementfunktion std::map<k, v>::insert verwenden.

+1

+1 In der Tat, viel sauberer. – GManNickG

+1

Nun, wenn Sie vermeiden werden, std :: copy zu benutzen, warum benutzen Sie nicht einfach den copy c'tor? m2 = m1. edit: Ah, er will die Vereinigung von Werten. – Stephen

+2

@Stephen: Da mit 'insert' der vorhandene Inhalt in' m2' beibehalten wird. Mit dem Operator copy * assignment * wird der vorhandene Inhalt in 'm2' gelöscht. –

19

Sie benötigen eine Variante eines insert iterator:

std::copy(m1.begin(), m1.end(), std::inserter(m2, m2.end())); 

inserter in <iterator> definiert ist. Es erfordert einen Platz zum Einfügen (daher die m2.end()) und gibt eine insert_iterator zurück.

+5

+1 für die richtige Antwort, aber man sollte Elementfunktionen zu Algorithmusaufrufen bevorzugen. –

+0

+1 @GMan, +1 @Billy, ihr beide habt es richtig gemacht. Das OP sollte tun, was Billy vorschlägt, aber GMan beantwortete die Frage tatsächlich. Also, mit deinen Kräften kombiniert ... – wilhelmtell

+5

@WilhelmTell: ICH BIN KAPITÄN PLANET! – GManNickG

Verwandte Themen