vector resize()自动填充

时间:2010-10-05 17:38:54

标签: c++ vector resize

我正在编写一个包含矩阵(具有双值)的类,表示为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()方法是否自动用零填充向量? 我的实施是否正常?

3 个答案:

答案 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()评估为零,所以是的,列向量最初将用零填充。