我想深入研究神经网络,因此我想编写自己的C++矩阵类。问题是我对C++也比较新手,为了保持简单,我想使用std::vector而不是2D数组。目前我的类大致如下:
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); }}
我的问题是:这种缩小方法是否如我所愿,或者有没有更好的方法来做这件事?
非常感谢!
回答:
缩小意味着变小。在构造函数的上下文中,我认为你指的是扩大。
你的解决方案并不是完全正确的,因为你的for
循环调整的是你想要调整的向量的副本的大小。
虽然不那么重要,但值得一提的是:此外,你还对一个空向量进行了不必要的复制来初始化data_
。事实上,当你进入构造函数的主体时,所有的成员都已经被构建了。最后,使用this->
来访问成员也不是必须的,除非与参数名存在歧义:
Matrix::Matrix(const int &rows, const int &columns) { data_.resize(rows); for (auto& col : data_) { // 注意这里的&,用于调整向量中的向量的大小 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)) {}