我正在编写一个类,它包含一个矩阵(双值),表示为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()方法会自动用零填充向量吗?我的实现正常吗?
发布于 2010-10-06 01:40:47
新元素采用vector成员的默认值,如果使用带有两个参数的resize重载,则采用特定值。
void resize(
size_type _Newsize,
Type _Val
);在你的例子中,缺省值将是一个空的vector<double> -如果这不是你想要的,把你想放在那里的东西传递给上面的重载。
不会修改现有元素。
发布于 2010-10-06 02:06:48
如果想要将整个2d数组置零,可以使用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;
}发布于 2010-10-06 01:58:53
没有一个std::vector<>方法会在内部使用任何形式的默认初始化。std::vector<>只要求它的元素是CopyConstructible和可赋值的,但不要求它们是DefaultConstructible。每当您遇到某些元素似乎是“无中生有”构造的情况(就像您的resize调用一样),这通常意味着您正在使用的std::vector<>方法有一个额外的参数,它允许您传递将从中复制构造新元素的值。我们通常不会注意到这一点,因为这些参数总是以与相应类型的()-initailized元素相等的默认值提供。
在您的示例中,
_matrix.at(i).resize(rhs.getCol());实际上被翻译成
_matrix.at(i).resize(rhs.getCol(), double());调用,这意味着在形式上是您隐式地传递新元素的初始值。
double()的计算结果为零,所以是的,列向量最初将用零填充。
https://stackoverflow.com/questions/3866202
复制相似问题