2015-09-21 47 views
2

編輯:不能使用矢量如何使用intitializer列表?

所以現在我正在練習類和頭。我需要做的事情之一是創建一個構造函數,可以使用初始化程序列表初始化2D數組。

我已經使用這個網站,試圖找出如何做到這一點:http://en.cppreference.com/w/cpp/utility/initializer_list

但它並沒有真正幫助我。

到目前爲止,我有構造函數的原型,隨着包括,爲intitializer列表中的typedef:

#include <initializer_list> 
typedef initializer_list<initializer_list<double>> i_list; 

Matrix::Matrix(const i_list & list) 
{} 

我需要能夠做這樣的事情x = {{1,2},{2,4}},這應該使我創造我的矩陣--x ---不必調用我的.at函數。

編輯:

我試着執行以下代碼,但遺憾的是它並導致錯誤。

Matrix::Matrix(const i_list & list) 
{ 

    lst.size(list.size()); 
    for (auto const& row: list) 
    { 

     (lst.begin(row),lst.end(row)); 
    } 
} 

lst在我的頭文件中定義爲:I_list lst。 I_list,因爲它是一個簡寫。

+1

我認爲這類型定義是一個壞主意,因爲它掩蓋了事實的說法是'的std :: initializer_list'因爲'的std :: initializer_list'有引用語義不是價值語義,隱藏你使用它並不是一個好主意。另外,你在類型上缺少'std ::'。 –

回答

3

你可以做這樣的事情

class Matrix 
{ 
public: 
    Matrix(const i_list& lst) 
    { 
     values.reserve(lst.size()); 
     for (auto const& row : lst) 
     { 
      values.emplace_back(std::begin(row), std::end(row)); 
     } 
    } 

    std::vector<std::vector<double>> values; 
}; 

代替原陣列,您可以使用std::vectorstd::vector的可用構造函數之一需要beginend迭代器,它們可用於std::initializer_list

Working demo

int main() 
{ 
    Matrix x = {{1,2},{2,4}}; 

    for (auto const& row : x.values) 
    { 
     for (double value : row) 
     { 
      std::cout << value << " "; 
     } 
     std::cout << std::endl; 
    } 
} 

輸出

1 2 
2 4 
+0

另一個'vector '構造函數需要'initializer_list '這樣你就可以做'values.push_back(row);' –

+0

我怎麼能不用vector類呢?可悲的是,我不能這樣做。我注意到在cpp參考文獻中,好像該列表也有一個開始和結束? – SomeStudent

1

沒有理由通過引用給const採取std::initializer_list。無論如何,它將被構建到位。而且實際上並不需要構造函數的主體,因爲可以使用std::vector迭代器構造函數。

我只想建議:

Matrix(std::initializer_list<std::initializer_list<double> > lst) 
: values{lst.begin(), lst.end()} 
{ } 
+0

我明白了,但是價值從哪裏來?另外,我不能使用矢量。 – SomeStudent

+0

@SomeStudent那麼你正試圖初始化什麼'Matrix'的成員呢?你沒有在問題中指定,所以我假設你與CoryKramer相同,你有一個'vector >''。 – Barry

+0

那麼,根據我的理解,當我們說矩陣X = {{1,2},{2,1}}例如,它是假設調用構造函數是矩陣(const I_list&列表) – SomeStudent