繁体   English   中英

使用 initializer_list 创建矩阵构造函数

[英]Creating a Matrix constructor using initializer_list

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);
           ^

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

您的段不包含的定义i_list ,但它似乎是一个std::initializer_listinitializer_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];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM