2012-01-14 24 views
0

的我有兩個方法:行爲推回

template <class T> 
Matrix<T>::Matrix(int rows, int cols, T* data) 

{ 
this->nRows = rows; 
this->nCols = cols; 

for (int i=0; i < nRows; i++) 
{ 

    vector<T> col(nCols); 
    for(int j=0;j<nCols;j++) 

     col[j]=*(data+i*nCols+j); 

    m.push_back(col); 

} 

}

而對於打印的矩陣:

template <class T> 
    void Matrix<T>::Dump(void) 
    { 
    cout << "\t[\n"; 
    for (int row=0; row<nRows; row++) 
    { 
    for (int col=0; col<nCols; col++) 
     cout << "\t\t" << m[row][col] << " "; 
    cout << "\n"; 
    } 
    cout << "\t]\n"; 
    } 

和測試用例是:

int M[]={1,2,3,3,4,7,2,5,8}; 
Matrix<int> m(3,3,M); 
m.Dump(); 

方案(在構造函數中)是:

for(int j=0;j<nCols;j++) 
    { 
     T val(*(data+i*nCols+j)); 
     col.push_back(val) ; 
     cout<<col[j]; 
    } 

輸出全爲0。

for(int j=0;j<nCols;j++) 
    { 
     T val(*(data+i*nCols+j)); 
     col[j]=val ; 
     cout<<col[j]; 
    } 

給出正確的結果。

請解釋爲什麼在這兩種情況下pushback行爲有所不同?

+7

它完全取決於col的類型。請發佈_complete_示例代碼。 – 2012-01-14 12:09:18

回答

2

vector<T> col(nCols); 

線已經與合同中的所有零列。 在第一種情況下,你推回新的價值,並得到這樣的

[0, 0, 0, 1, 2, 3] 

作爲第一列。所以不足爲奇,

cout<<col[j]; 

輸出零,因爲j不大於2!

1

由於您在第二個示例中調用col[j]成功,因此在進入循環之前,您的vector中有足夠的元素存儲所有j的值。但是,push_back將更多元素添加到矢量的後面,超過索引j處的位置。這就是爲什麼在循環中打印值時看到全零。如果將第一個示例更改爲打印

cout<<col[col.size()-1]; 

您將看到剛纔推送的值。雖然他們不會像第一個例子那樣處於相同的位置。

1

似乎col最初不是空的。