推迟的行为

时间:2012-01-14 12:08:30

标签: c++ stl copy-constructor

我有两种方法:

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];
     }

给出正确的结果。

请解释为什么两种情况下的推回行为都不同?

3 个答案:

答案 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似乎不是空的。