用std::vector创建矩阵类,如何在构造函数中设置std::vector的大小



我正在创建一个名为"矩阵";具有std::vector<std::vector<T>>类成员的,在类构造函数中设置其大小的最佳优化方式是什么?我在m行的构造函数中使用matrix_.resize(m),然后使用for循环来设置其行值(矩阵m x n(。我的问题是:

  1. 使用.resize((是个好方法吗?我听说它效率不高,但我想不出其他什么

  2. 例如,当我使用std::vector<std::vector<T>> = matrix_;并且使用matrix_.resize(m)时,matrix_现在将具有"0";m〃;用于";m〃;std::vector<T>对象,但如果matrix_不知道其对象(std::vector<T>(的大小,它将如何管理内存?如果每个对象的大小(1000(或更大,该怎么办?

#include <iostream>
#include <vector>
// Matrix of shape m x n, 'm' lines and 'n' columns
template <typename T>
class matrix {
private:
typedef T value_type;
typedef std::vector<value_type> row;
std::vector<row> matrix_;

public:
// Default constructor, initializes a matrix of size 1x1, with element 0.
matrix() {
matrix_.resize(1);
row temp = {0};
matrix_[0] = temp;
};
matrix(size_t m, size_t n) {
matrix_.resize(m);
// Appends 'm' rows to the matrix_
for (size_t i = 0; i < m; i++) {
row temp(n);    // Creates a row of 'n' columns
matrix_[i] = temp;
}
}
value_type& at (size_t m, size_t n) {
return matrix_[m][n];
}
};
int main() {
matrix<double> first(2, 2);
first.at(0, 0) = 3.3;
first.at(0, 1) = 5.2;
first.at(1, 0) = 8.9;
first.at(1, 1) = 1.4;
return 0;
}

最好的方法是不这样做。矢量的矢量是个坏主意,尤其是在小尺寸的情况下,因为您希望内存是连续的。

template <typename T>
class matrix {
public:
typedef T value_type; // expose this
private:
std::size_t m_size = 0;
std::size_t n_size = 0
std::vector<T> data;
public:
// Default constructor, initializes a matrix of size 0
matrix():matrix(0,0) {};
// square matrix
explicit matrix(std::size_t n):matrix(n,n) {};
matrix(std::size_t m, std::size_t n):
m_size(m), n_size(n),
data(m*n, 0)
{}
value_type& operator()(size_t m, size_t n) {
return data[m*n_size + n];
}
value_type const& operator()(size_t m, size_t n) const {
return data[m*n_size + n];
}
};

添加array_viewspan:

template<class It>
struct range {
It b, e;
It begin()const{return b;}
It end()const{return e;}
std::size_t size()const{ return end()-begin(); }
bool empty()const{ return begin()==end(); }
};
template<class T>
struct array_view:range<T*> {
T& operator[](std::size_t i)const{
return this->begin()[i];
}
array_view(T* start, T* finish):range<T*>{ start, finish }{}
array_view():array_view(nullptr, nullptr){}
array_view(T* start, std::size_t length):array_view( start, start+length ) {}
};

有了它,我们可以添加

array_view<T> operator[](std::size_t m) {
return {std::addressof(data[m*n_size]), n_size};
}
array_view<T const> operator[](std::size_t m) const {
return {std::addressof(data[m*n_size]), n_size};
}

现在您可以获得高效的matrix[a][b]语法。(addressof只是我的偏执(。

最新更新