簡體   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