我有两种方法:
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];
}
给出正确的结果。
请解释为什么两种情况下的推回行为都不同?
答案 0 :(得分:2)
此
vector<T> col(nCols);
行已经收缩了一列,其中包含全部零。 在第一种情况下,你推回新值并得到这样的东西
[0, 0, 0, 1, 2, 3]
作为第一列。所以
就不足为奇了cout<<col[j];
输出零,因为j不大于2!
答案 1 :(得分:1)
由于您在第二个示例中对col[j]
的调用成功,因此您的vector
中有足够的元素可以在进入循环之前为j
的所有值存储值。但是,push_back
会将更多元素添加到向量的背面,超过索引j
的位置。这就是为什么在循环中打印值时会看到全零的原因。如果您更改第一个示例以打印
cout<<col[col.size()-1];
您将看到刚刚推送的值。但是,它们与第一个例子中的位置不同。
答案 2 :(得分:1)
似乎col
似乎不是空的。