通过矢量矢量迭代

时间:2014-08-26 08:58:01

标签: c++ templates vector stl

我一直在努力解决这个问题,没有运气就广泛搜索答案,所以我希望你能帮助我。

我在c ++中使用stl矢量向量来编写模板矩阵类,用于存储矩阵值,如下所示:

std::vector< std::vector< T > > m;

其中大写字母T是模板类。到目前为止,我已经使用简单的嵌套for循环和双括号[] []访问了数组,正如您在此重载运算符中看到的那样:

template< class T >
Matrix<T> Matrix<T>::operator + ( const Matrix<T>& rhs )
{
  Matrix<T> result( rows_, cols_ );

  if( ( rows_ == rhs.rows_ ) && ( cols_ == rhs.cols_ ) )
  {
    for ( unsigned int i = 0 ; i < rows_ ; i++ )
    {
      for ( unsigned int j = 0 ; j < cols_ ; j++ )
      {
        result.m[i][j] = m[i][j] + rhs.m[i][j];
      }
    }
  }
  return result;
}

一切正常,直到我认为使用内置的stl迭代器为向量更干净,更安全。它目前看起来像这样:

template< class T >
Matrix<T> Matrix<T>::operator - ()
{
  Matrix<T> result( rows_, cols_, 0.0);

  for 
  (
    typename std::vector< std::vector< T > >::iterator
    iRow = m.begin() ;
    iRow < m.end()   ;
    iRow++
  )
  {

    for 
    (
      typename std::vector< T >::iterator
      iCol = iRow->begin() ;
      iCol < iRow->end()   ;
      iCol++
    )
    {
      result.m[iRow][iCol] = -( m[iRow][iCol] );
    }
  }
  return result;
}

现在我得到:错误:不匹配'[]运算符'和一个非常广泛的冗长候选列表。但是,在尝试了解问题并重写代码一段时间之后,它仍然无法编译。请指出我正确的方向。

问候,迈克尔

1 个答案:

答案 0 :(得分:6)

这不是迭代器的工作方式。迭代器不是索引,它更像是指针。因此,您需要在源矩阵和目标矩阵上使用迭代器。我说在你的情况下,指数实际上是更好的选择。

但是如果你想使用iteratos,你可以这样做:

  for 
  (
    typename std::vector< std::vector< T > >::iterator
    iRowS = m.begin(), iRowD = result.m.begin();
    iRowS != m.end();
    ++iRowS, ++iRowD
  )
  {
    for 
    (
      typename std::vector< T >::iterator
      iColS = iRowS->begin(), iColD = iRowD->begin();
      iColS != iRowS->end();
      ++iColS, ++iColD
    )
    {
      *iColD = - *iColS;
    }
  }