我正在编写一个包含矩阵(具有双值)的类,表示为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()
方法是否自动用零填充向量?
我的实施是否正常?
答案 0 :(得分:5)
如果您使用带有两个参数的vector
重载,则新元素将采用resize
成员的默认值或特定值。
void resize(
size_type _Newsize,
Type _Val
);
在您的情况下,默认值为空vector<double>
- 如果这不是您想要的,请将您想要放在那里的内容传递给上面的重载。
不修改现有元素。
答案 1 :(得分:3)
如果要将整个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;
}
答案 2 :(得分:0)
std::vector<>
方法都没有在内部使用任何形式的默认初始化。 std::vector<>
仅要求其元素为 CopyConstructible 和可分配,但不要求它们为 DefaultConstructible 。每次遇到某些元素似乎是“无中生有”的情况时(就像你的resize
调用一样),通常意味着你使用的std::vector<>
方法有一个额外的参数,它允许您传递将从中复制构造新元素的值。我们通常不会注意到,因为这些参数始终提供的默认值等于相应类型的()
- initailized元素。
在你的情况下,
_matrix.at(i).resize(rhs.getCol());
实际上已翻译成
_matrix.at(i).resize(rhs.getCol(), double());
调用,意味着正式的是你隐式地传递新元素的初始值。
double()
评估为零,所以是的,列向量最初将用零填充。