2016-06-21 1 views
3

私はstd::vector<vector<double>>を入力したいと思います。 プログラムの後半で、いくつかの計算のために3次元座標を保存する必要があります。ベクトルを挿入するためにpush_backを使用して<double>をベクターに入れます<<double>>

私はこれを行う場合、私の質問は:

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

一時の清算及び補充は、データの値に影響を与えるのだろうか?

私はすでにこれを見つけましたが、説明は「新しい内容にvalの内容がコピー(または移動)されます」という意味ですので、http://www.cplusplus.com/reference/vector/vector/push_back/です。私は何を考えるべきか分からない。私にとってこれは矛盾のように聞こえる。

私の場合のように、限られた範囲内でのみ有効なので、変数が参照として渡されるかどうかはあまり意味がないと思います。 私は私の前提に沿って正しいですか?

答えて

5

dataはタイプstd::vector<std::vector<double>>であるなら、あなたは罰金だ:temp値コピーが取られます。 push_back引数として使用した後は、tempで自由にしてください。

ただし、ベクターのアロケータを使いこなしたことがある場合は、さらに注意する必要があります。あなたはワンライナーとして、現実には、私はあなたが少しでtempを移入したい疑いがあること行うことができ

// 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*/ 
} 

定置emplace_backを参照)、不要なディープコピーを回避することができますを使用して

もっと気をつけろ。だから私は2つの行を別々にしておきました。

1

あなたは、docにpush_back関数の2つのオーバーロードされたバージョン

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

がある最初はvalとベクトルにコピーしにconst参照を取る見ることができるように。 2番目のものはrvalue参照(詳細はmove sematicsを参照)を使用し、valをソースベクトルを空のままにしてベクトルに移動します。 どちらもベクトル内の一時オブジェクトへの参照を格納しません。

たとえば、ローカル変数などを渡すと、最初のバージョンが呼び出されます。

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

秒1に - あなたは、一時的な変数を渡すか、明示的に(TEMP)を一backを意味し、 "(または移動)"(STDを一backを指し、 "コピー" 変数

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

ああごめん、私が代わりにC++ 11の選択されたC++ 98を持っていた、そのため私はオーバーロードされた関数を参照して混乱していたしませんでした表示されませんでした。 – NiKoCh

1

を移動する::移動(一時))

関連する問題