Сожмите 2D-вектор в C ++ - PullRequest
2 голосов
/ 05 мая 2019

Я хочу попасть в нейронные сети, и поэтому я хочу написать свой собственный класс матрицы C ++.Проблема в том, что я также довольно новичок в C ++ и для простоты хочу использовать std :: vector вместо 2D-Array.На данный момент мой класс выглядит примерно так:

class Matrix {

private:

    std::vector<std::vector<float>> data_;

public:

    Matrix(const int& rows, const int& columns);
};

Я знаю, что std :: vector - это немного накладных расходов, но я хочу, чтобы эти издержки были как можно меньше, сжимая вектор только до точного размера.Нужно:

Matrix::Matrix(const int &rows, const int &columns) {
    this->data_ = std::vector<std::vector<float>>{};
    this->data_.resize(rows);
    for (auto col : this->data_) {
        col.resize(columns);
    }

}

Мой вопрос: это сокращение работает так, как я планировал, или есть лучший способ сделать это?

Большое спасибо!

1 Ответ

2 голосов
/ 05 мая 2019

Сокращение означает уменьшение .Учитывая контекст конструктора, я думаю, что вы имеете в виду увеличение .

Ваше решение не совсем в порядке, так как ваш for -тип изменяет размер векторов, размер которых вы хотите изменить.

Менее важно, но стоит упомянуть: Кроме того, вы делаете ненужную копию пустого вектора для инициализации data_.Фактически, когда вы вводите тело конструктора, все элементы уже созданы.Наконец, нет необходимости использовать this-> для доступа к членам, если не будет неоднозначности с именем параметра:

Matrix::Matrix(const int &rows, const int &columns) {
    data_.resize(rows);
    for (auto& col : data_) {   // note the & to resize the vector in the vector 
        col.resize(columns);
    }
}

Добавление:

Выможет также предоставить явные параметры для конструкторов членов:

Matrix::Matrix(const int &rows, const int &columns) : data_(rows) {
    for (auto& col : data_) {
        col.resize(columns);
    }
}

Если вам нравится краткость, вы можете даже пойти на:

Matrix::Matrix(const int &rows, const int &columns) : data_(rows, vector<float>(columns)) {
}
...