C++ vector resize()自动填充

C++ vector resize()自动填充,c++,vector,resize,C++,Vector,Resize,我正在编写一个类,它包含一个矩阵(由两个值组成),表示为vector 我想实现操作符=,用给定稀疏矩阵的细节重新填充我的矩阵。我正在编写以下代码: RegMatrix& RegMatrix::operator=(const SparseMatrix rhs){ if(*this != rhs){ _matrix.clear(); _matrix.resize(rhs.getRow()); int i; for(i=0

我正在编写一个类,它包含一个矩阵(由两个值组成),表示为
vector

我想实现
操作符=
,用给定稀疏矩阵的细节重新填充我的矩阵。我正在编写以下代码:

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;
}
RegMatrix&RegMatrix::operator=(const SparseMatrix rhs){
如果(*此!=rhs){
_matrix.clear();
_resize(rhs.getRow());
int i;

对于(i=0;i新元素,采用
向量
成员的默认值,或者如果使用带有两个参数的
resize
重载,则采用特定值

void resize(
   size_type _Newsize,
   Type _Val
);
在您的情况下,默认值将是一个空的
向量
——如果这不是您想要的,请将您想要放在那里的内容传递给上面的重载

现有元素不会被修改。

任何
std::vector
方法都不会在内部使用任何形式的默认初始化。
std::vector
只要求其元素是可复制和可分配的,但不要求它们是可默认构造的。每当遇到某些元素看起来不可复制的情况时o被构造为“从无到有”(就像您的
resize
调用一样)这通常意味着您使用的
std::vector
方法有一个额外的参数,允许您传递用于复制构造新元素的值。我们通常不会注意到,因为这些参数总是提供与
()
-对应类型的初始化元素

在你的情况下

_matrix.at(i).resize(rhs.getCol());
实际上是翻译成

_matrix.at(i).resize(rhs.getCol(), double());
调用,这意味着在形式上是您隐式地传递新元素的初始值


double()
计算结果为零,因此是的,列向量最初将用零填充。

如果要将整个二维数组归零,可以使用:

v.assign(大小,向量(大小,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;
}
RegMatrix&RegMatrix::operator=(const SparseMatrix rhs){
如果(*此!=rhs){
_赋值(rhs.getRow(),vector(rhs.getCol(),0.);

对于(i=0;iso,如果我想要一个zise RowXCol的二维向量,并且每个内部向量的元素的值都是0,那么我应该更改该行,使其看起来像:_matrix.at(i).resize(rhs.getCol(),0)?@limlim:您不需要更改它。您已经在隐式传递该零。您也可以显式传递该零,但它不会更改任何内容。如果您认为显式传递该0会使代码更清晰,那么您可以继续并将其放在那里。但在功能方面不会有任何区别。如果我没有弄错,resize不会将现有元素归零。如果您想这样做,请使用assign(查看我的答案了解更多)。@JoshD:OP的向量没有任何“现有元素”。在调用
resize
之前,它们总是空的。@JoshD:呃……他没有任何现有元素,因为他事先调用了
clear
。这就是我要说的。我并不完全清楚你为什么称之为“浪费步骤”。你建议的解决方案(使用
assign
)只是在
clear
(至少通过规范)上的一个包装,然后是一系列效率更低的步骤。不,只有新添加的元素(如果有的话)将为零。@c-urchin:Huh?首先,当我说“新元素”时a表示新添加的元素,这非常清楚。其次,我的最后一句话适用于特定OP的代码,其中向量最初为空。因此,正如我所说,调整大小后,它将被零填充。为什么如此敏感?事实上,OP说(请重读它)“重新填充”这意味着已经设置了一些值。@c-urchin:请注意。OP在执行任何其他操作之前会显式调用
clear
。因此,在
调整大小
时没有现有元素。您不明白其中的哪一部分?也不需要显式的
0
v.assign(大小,向量(大小))
也会这样做。
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;
}