我一直在努力解决这个问题,没有运气就广泛搜索答案,所以我希望你能帮助我。
我在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;
}
现在我得到:错误:不匹配'[]运算符'和一个非常广泛的冗长候选列表。但是,在尝试了解问题并重写代码一段时间之后,它仍然无法编译。请指出我正确的方向。
问候,迈克尔
答案 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;
}
}