2010-10-05 114 views
4

我正在写一个持有矩阵(双值)的类,表示为vector<vector<double>>;矢量调整大小()自动填充

我想实现operator=,用给定的稀疏矩阵的细节重新填充我的矩阵。我写了下面的代码:

RegMatrix& RegMatrix::operator=(const SparseMatrix rhs){ 
    if(*this != rhs){ 
     _matrix.clear(); 
     _matrix.resize(rhs.getRow()); 
     int i; 
     for(i=0;i<rhs.getRow();++i){ 
      _matrix.at(i).resize(rhs.getCol()); 
     } 

     for(i=0;i<rhs.getSize();++i){ 
      Element e = rhs.getElement(i); 
      _matrix[e._row][e._col] = e._val; 
     } 
    } 

    return *this; 
} 

是否resize()方法自动填充用零向量? 我的执行是否正常?

回答

5

新元素采用vector成员的默认值,或者如果使用带有两个参数的resize重载的特定值。

void resize(
    size_type _Newsize, 
    Type _Val 
); 

在你的情况下,默认将是一个空vector<double> - 如果这不是你想要什么,传递你想放在那里过载上面什么。

现有元素未被修改。

+0

所以,如果我想的姿色RowXCol的二维向量,每个内部向量的元素将有0值,我应该更改行,以便它看起来像这样:_matrix.at(i).resize(rhs.getCol(),0); ? – limlim 2010-10-05 17:52:14

+0

@limlim:你不需要改变它。你已经隐含地*传递了这个零。你也可以明确地传递这个零,但它不会改变任何东西。如果你相信通过这个0明确地让你的代码更清晰,那么你可以继续并把它放在那里。但它在功能方面没有任何区别。 – AnT 2010-10-05 18:06:47

+0

如果我没有弄错,调整大小不会使现有元素为零。如果这就是你想要做的,使用分配(查看我的答案更多)。 – JoshD 2010-10-05 18:09:32

0

没有任何std::vector<>方法在内部使用任何形式的默认初始化。 std::vector<>仅要求其元素为CopyConstructible可指定,但不要求它们是DefaultConstructible。每次遇到某些情况时,“无中生有”元素(例如resize调用)通常意味着您正在使用的std::vector<>方法有一个额外参数,该参数允许您通过新元素将从中复制构建的值。我们通常不会注意到这一点,因为这些参数总是以默认值提供,相当于相应类型的新元素。

在你的情况下,

_matrix.at(i).resize(rhs.getCol()); 

居然被翻译成

_matrix.at(i).resize(rhs.getCol(), double()); 

通话,这意味着正式它是你谁的隐含经过初始值的新元素。

double()的计算结果为零,所以是的,列矢量最初将用零填充。

+0

不,只有新添加的元素(如果有)将为零。 – 2010-10-05 18:06:02

+0

@ c-urchin:哼?首先,当我说“新元素”时,意味着新添加的元素足够清晰。其次,我的最后一句话适用于具体OP的代码,其中的矢量最初是* empty *。所以,如我所说,它会在调整大小后用零填充。 – AnT 2010-10-05 18:08:59

+0

为什么这么敏感?事实上,OP表示(请重新阅读)“重新填写”,这意味着已经设置了一些值。 – 2010-10-05 18:15:21

2

如果你想零出整个二维数组,你可以使用assign function of vector

v.assign(size, vector<double>(size, 0.)); 

这将使用零填充sizeXsize的2D矢量。

你的情况:

RegMatrix& RegMatrix::operator=(const SparseMatrix rhs){ 
    if(*this != rhs){ 
     _matrix.assign(rhs.getRow(), vector<double>(rhs.getCol(), 0.)); 

     for(i=0;i<rhs.getSize();++i){ 
      Element e = rhs.getElement(i); 
      _matrix[e._row][e._col] = e._val; 
     } 
    } 

    return *this; 
} 
+0

也不需要明确的'0'。 'v.assign(size,vector (size))'会做同样的事情。 – AnT 2010-10-05 18:13:07