2016-06-21 12 views
3

Ich habe eine std::vector<vector<double>> Ich möchte eine Funktion ausfüllen. Ich muss einige dreidimensionale Koordinaten für einige Berechnungen später in meinem Programm speichern.mit push_back, um einen Vektor <double> in einen Vektor <vector <double>>

Meine Frage ist, wenn ich dies tun:

//in classdefinition 
std::vector<std::vector<double>> data; 

    myFunc() 
    { 
     std::vector<double> temp; 
     temp.push_back(1); 
     temp.push_back(2); 
     temp.push_back(3); 
     data.push_back(temp); 

     temp.clear(); 
     //new data 
     temp.push_back(2); 
     temp.push_back(3); 
     temp.push_back(4); 
     data.push_back(temp); 
    } 

wird das Clearing und Nachfüllen von Temp die Werte in Daten beeinflussen?

Ich habe bereits diese http://www.cplusplus.com/reference/vector/vector/push_back/ gefunden, aber da die Erklärung lautet: "Der Inhalt von val wird kopiert (oder verschoben) auf das neue Element." Ich weiß nicht, was ich denken soll. Das klingt für mich nach einem Widerspruch.

Ich denke, es würde nicht viel Sinn machen, wenn die Variablen als Referenz übergeben werden, da sie, wie in meinem Fall, nur in einem begrenzten Umfang gültig sind. Habe ich recht mit meiner Annahme?

Antwort

5

Wenn data vom Typ std::vector<std::vector<double>> dann sind Sie fein: ein Wert Kopie von temp genommen wird; Sie können also nach Belieben mit temp arbeiten, nachdem Sie es als push_back Argument verwendet haben.

Wenn Sie jedoch mit dem Allokator des Vektors herumgespielt haben, müssen Sie möglicherweise mehr Sorgfalt walten lassen.

Mit Einlagerungs (siehe emplace_back) kann die unnötige tiefe Kopie vermeiden:

// First row of data 
{ 
    std::vector<double> temp = {1, 2, 3}; /*ain't C++11 brilliant?*/ 
    data.emplace_back(std::move(temp)); /*do not use temp after this line - 
           use scope blocks so you're not tempted*/ 
} 

Sie konnte tun, als Einzeiler obwohl in Wirklichkeit ich Sie temp mit etwas wollen vermuten aufzufüllen mehr Pflege. Also habe ich die beiden Zeilen getrennt gehalten.

1

Wie Sie in doc sehen können, gibt es zwei überladene Versionen von push_back Funktion

void push_back (const value_type& val); 
void push_back (value_type&& val); 

Die erste nimmt const Verweis auf val und kopiert sie in den Vektor. Die zweite verwendet Rvalue-Referenz (siehe move sematics für weitere Informationen) und verschiebtval in Vektor verlassen Quellvektor leer. Keiner von ihnen speichert Verweis auf temporäres Objekt innerhalb des Vektors.

Erste Version wird aufgerufen, wenn Sie beispielsweise lokale Variable übergeben.

std::vector<std::vector<double>> v; 
std::vector<double> lv = {1, 3, 7}; 
v.push_back(lv); 

die zweite - wenn Sie temporäre Variable übergeben oder explizit Variable bewegen

v.push_back(std::vector<double>({0, 17, 42})); 
v.push_back(std::move(lv)); 
+0

Oh Entschuldigung, ich habe nicht gesehen, dass ich C++ 98 anstelle von C++ 11 ausgewählt hatte, daher habe ich die überladene Funktion nicht gesehen und war verwirrt. – NiKoCh

1

"kopiert" bezeichnet (temp) und "(oder bewegt)" bezieht sich auf push_back (std :: push_back move (temp))

Verwandte Themen