Поведение отталкивания - PullRequest
       35

Поведение отталкивания

0 голосов
/ 14 января 2012

У меня есть два метода:

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 ]

2 голосов
/ 14 января 2012

Эта строка

 vector<T> col(nCols);

уже сокращает столбец со всеми нулями в нем.В первом случае вы возвращаете новое значение и получаете что-то вроде

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

в качестве первого столбца.Поэтому неудивительно, что

cout<<col[j];

выводит нули, потому что j не больше 2!

1 голос
/ 14 января 2012

Похоже, col изначально не пустой.

1 голос
/ 14 января 2012

Поскольку ваш вызов col[j] во втором примере завершается успешно, похоже, что в вашем vector достаточно элементов для сохранения значений для всех значений j перед входом в цикл.Однако push_back добавляет больше элементов в конец вектора , минуя позицию в индексе j.Вот почему вы видите все нули при печати значений в цикле.Если вы измените первый пример на печать

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

, вы увидите значения, которые вы только что нажали.Однако они не будут в тех же позициях, что и в первом примере.

...