2011-12-02 73 views
1

當我運行下面的代碼,在我trainingVector我得到:替代如何在每次迭代中創建新的向量?

{(10,0),(10,0),(10,0)...} 

{(0,0),(1,0),(2,0)...} 

我如何正確地做這項工作?

vector< vector<double> * > trainingVector; 
for(int i=0;i<10;i++){  
    vector<double> ok (2,0); 
    ok[0]=i; 
    trainingVector.push_back(&ok) 
} 

回答

2

你使用的是現在不會起作用,因爲每個矢量ok對象的生命週期只持續內迭代它超出範圍之前和死亡的方法。

你需要做這個:

vector< vector<double> * > trainingVector; 
for(int i=0;i<10;i++){  
    vector<double> *ok = new vector<double>(2,0); 
    (*ok)[0]=i; 
    trainingVector.push_back(ok); 
} 

請注意,您將需要手動稍後釋放每個內部向量。否則你會得到內存泄漏。

for(int i=0;i<10;i++){  
    delete trainingVector[i]; 
} 

或者,你可以不用指針一起:

vector< vector<double> > trainingVector; 
for(int i=0;i<10;i++){  
    vector<double> ok(2,0); 
    ok[0]=i; 
    trainingVector.push_back(ok); 
} 

雖然這後一種方法意味着複製內部矢量,當它被放入外載體。

+0

如果每個向量的壽命只持續在迭代中,他不會得到所有十個推入引用的輸出,只是最後一個或沒有,這取決於他檢查父向量的時間。問題在於他不是每次都創建一個新的向量,而是引用同一個(相同的內存位置,在堆棧中) – Wizetux

+0

實際上,他所看到的(引用同一個)僅僅是未定義行爲的結果他是通過訪問已經超出範圍的東西而造成的。 – Mysticial

+1

@Wizetux:*錯誤*。代碼每次創建一個* new *向量,並且每個向量僅在迭代中持續。稍後解引用指針是未定義的行爲,並且一切都是可能的。 –

4

只是不要使用指針。

std::vector<std::vector<double>> trainingVector; 
for (int i = 0; i < 10; ++i) { 
    std::vector<double> ok(2, 0); 
    ok[0] = i; 
    trainingVector.push_back(ok); 
} 

也可以考慮用Boost.MultiArray代替。

+0

嘿,貓,我必須使用指針......神祕的答案爲我工作。 – sks

+0

@sks:因爲爲什麼? –

+0

,因爲訓練矢量的元素 - 我需要修改它們而不用調用訓練矢量 – sks

相關問題