vector resize () автоматическое заполнение - PullRequest
4 голосов
/ 05 октября 2010

Я пишу класс, который содержит матрицу (двойных значений), представленную как 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 ]

5 голосов
/ 05 октября 2010

Новые элементы принимают значение по умолчанию vector элемента или конкретное значение, если вы используете перегрузку resize с двумя параметрами.

void resize(
   size_type _Newsize,
   Type _Val
);

В вашем случае по умолчанию будет пустое значение vector<double> - если это не то, что вы хотите, передайте то, что вы хотите поместить в перегрузку выше.

Существующие элементы не изменены.

3 голосов
/ 05 октября 2010

Если вы хотите обнулить весь 2d массив, вы можете использовать функцию присваивания вектора :

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

При этом двумерный вектор размера sizeXsize будет заполнен нулями.

В вашем случае:

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 голосов
/ 05 октября 2010

Ни один из std::vector<> методов никогда не использует внутреннюю форму инициализации по умолчанию.std::vector<> требует, чтобы его элементы были CopyConstructible и Assignable , но не требует, чтобы они были DefaultConstructible .Каждый раз, когда вы сталкиваетесь с ситуацией, когда некоторые элементы кажутся построенными «из ничего» (как в случае ваших вызовов resize), это обычно означает, что используемый вами метод std::vector<> имеет дополнительный параметр, который позволяетвам передать значение, из которого будут созданы новые элементы.Мы не часто замечаем это, поскольку эти аргументы всегда снабжаются значениями по умолчанию, равными () -инициализированному элементу соответствующего типа.

В вашем случае,

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

фактически переводится в

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

, что означает, что формально именно вы 1020 * неявно передаете начальное значение для новых элементов.

double() оценивается какноль, так что да, векторы столбцов будут изначально заполнены нулями.

...