矩阵类的数组样式初始化

时间:2021-03-18 10:54:30

标签: c++ matrix c++17

假设我想在 C++ 中创建一个矩阵类,它可以使用大括号进行初始化:

matrix<int> M = {{1,2,3}, {2,3,1}}

正如我发现的那样,右侧是一个 std::initializer_list 对象。我尝试实现以下内容:

template <typename ring>
class matrix {
private:
  std::vector<std::vector<ring>> vals;
public:
  matrix<ring>& operator=(const std::initializer_list<std::initializer_list<ring>>& rhs);
};

template<typename ring>
matrix<ring>& matrix<ring>::operator=(const std::initializer_list<std::initializer_list<ring>>& rhs) {
  unsigned new_rows = rhs.size();
  unsigned new_cols = 0;
  for (unsigned i=0; i<new_rows; ++i) if (new_cols < rhs[i].size()) new_cols = rhs[i].size();
  vals.resize(new_rows);
  for (unsigned i=0; i<vals.size(); ++i) {
    vals[i].resize(new_cols);
    for (unsigned j=0; j<new_cols; ++j) {
      vals[i][j] = rhs[i][j];
    }
  }
  return *this;
}

这不起作用,我得到了错误消息,即 rhs 无法接受 rhs[i][j] 实现。我做错了什么?

1 个答案:

答案 0 :(得分:2)

matrix<double> M = {{1,2,3}, {2,3,1}}

copy-list-initialisation。你需要一个构造函数

matrix<ring>(std::initializer_list<std::initializer_list<ring>> rhs) : vals(rhs.begin(), rhs.end()) {}

我会保留赋值运算符,但使用构造函数来实现它

matrix<ring>& matrix<ring>::operator=(std::initializer_list<std::initializer_list<ring>> rhs) {
    matrix temp = rhs;
    std::swap(vals, temp.vals);
    return *this;
}

另外:std::initializer_list 已经是一个具有常量引用语义的类型,你也可以按值来获取它。

相关问题