使用 initializer_list 创建矩阵构造函数

Creating a Matrix constructor using initializer_list

本文关键字:构造函数 创建 list initializer 使用      更新时间:2023-10-16
Matrix::Matrix(const i_list & list){
uint rows = list.size();
uint cols = list.begin()->size();
int cnt = 0;
mtrx = new double*[rows];
  for(int j = 0; j < cols; j++){
    mtrx[j] = new double[cols];
  }
  for(int k = 0; k < rows; k++){
    for(int l = 0; l < cols; l++){
      mtrx[k][l] = *(list.begin() + cnt);
      cnt++;
    }
  }
}

它一直给我错误:

Matrix.cpp:30:15: error: cannot convert ‘const 
std::initializer_list<double>’ to ‘double’ in assignment
mtrx[k][l] = *(list.begin() + cnt);
           ^

有没有办法将其转换为双精度?铸造不起作用。

您的代码段不包含i_list的定义,但似乎它是 initializer_list s 的std::initializer_list。因此

*(list.begin() + cnt);

是一个initializer_list对象本身(一个内部对象(,而不是一个double。这就是您收到的错误消息。

您可能希望将双循环转换为如下所示的内容:

#include <algorithm>
auto inner = std::begin(list);
for(int k = 0; k < rows; ++k, ++inner) 
    std::copy(std::begin(*inner), std::end(*inner), &mtrx[k][0]);

这会遍历list项;对于每个项,它用对std::copy的调用替换内部循环。

根据代码,我推断您的i_list是这样的嵌套initializer_list

std::initializer_list<std::initializer_list<double>>

这意味着当你调用*(list.begin() + cnt)(这是另一种编写list.begin()[cnt]的方式(时,你不会得到double元素,而是在位置cnt得到一个内部列表。

要获取元素,您必须首先获取位置 k 的内部列表,然后在该列表的位置 l 获取元素:

mtrx[k][l] = list.begin()[k].begin()[l];