2014-04-24 4 views
6

Derzeit habe ich einige Daten in einem Vektor. Zur Zeit möchte ich den Vektor in eine Karte umwandeln.
So wird es wie folgt organisiert werden (N ist gerade Nummer).Wie vektor kopieren, um in STL in einer würdevollen Weise zu kopieren

Vektor: Element 1, Element 2, Element 3 Element 4 ... Element N.

Karte: Key1: Element 1, Wert1: Element 2, Key2: Element 3 Wert2: Element 4 ...

Derzeit zähle ich nur Vektor auf, gibt es einen anderen anmutigen Weg, es zu tun. C++ 11 ist bevorzugt. Vielen Dank.

for (int x = 0; x < vec.size();) 
{ 
    map[vec[x]] = vec[x+1]; 
    x+=2; 
} 
+2

'X + = 2' kann in den Loop-Header nach dem zweiten Semikolon gehen. – dasblinkenlight

+0

Ich kann nicht Kopf oder Schwanz Ihrer Beschreibung von dem, was die Karte gefallen sollte. Warum hat es Schlüssel, Werte * und * Elemente und warum sind die Zahlen nicht in Ordnung? Und wie werden Elemente im Vektor zu Schlüsseln und Werten in der Karte? –

+2

Sie sollten nach einer ungeraden Anzahl von Elementen suchen, außer Sie sind sicher, dass das nicht passieren kann. Ansonsten sieht das gut aus. –

Antwort

6

Ihr Code funktioniert (beachten Sie Michael Js Vorschlag, das letzte Element nicht zu bearbeiten, wenn eine ungerade Zahl vorhanden ist).

Es gibt eine kleine Verbesserung, die gemacht werden kann. Der Aufruf map[vec[x]] erstellt einen Eintrag unter Verwendung des Standardkonstruktors value_type, und der Kopierzuweisungsoperator kopiert dann den Wert von vec[x+1].

Sie konnten die Kopie-Zuordnung Schritt vermeiden, indem Sie:

the_map.insert(std::make_pair(vec[x], vec[x+1])); 

Ich denke, das von dem Paar der MapEintrag kopier konstruiert ist, endet. In C++ 11 können Sie:

the_map.emplace(vec[x], vec[x+1]); 

, was es dem Compiler ermöglicht, den Kopieraufwand zu minimieren. Wenn Ihr Objekt die Bewegungssemantik unterstützt und Sie den Vektor danach zerstören wollen, können Sie sogar gehen:

the_map.emplace(std::move(vec[x]), std::move(vec[x+1])); 
+1

Aufgrund der Rückgabewertoptimierung wird normalerweise keine zusätzliche Kopie erstellt, da std :: make_pair eine temporäre Kopie zurückgibt. In C++ 11 erzeugen beide Versionen wegen der Verschiebungssemantik keine zusätzlichen Kopien. – Veritas

+1

OK danke für die Info. Ich bin nicht genau darüber informiert, was die Einlagerung bewirken kann –