如何使用二维 initializer_list 进行初始化?

Rob*_*Fir 3 c++ initialization matrix initializer-list

我知道,该向量类以下列方式初始化:

Vector::Vector(initializer_list<double> lst)
    :size{static_cast<int>(lst.size())},elem{new double[static_cast<int>(lst.size())]}
    {
        copy(lst.begin(),lst.end(),elem);
    }
Run Code Online (Sandbox Code Playgroud)

这是我的矩阵类:

class Matrix{
private:
    int row;
    int col;
    double elem**
public:
    //Default Constructor:
    Matrix(int row,int col);
    //Initialized list constructor:
    Matrix(initializer_list<initializer_list<double>> lst);
Run Code Online (Sandbox Code Playgroud)

我想,我应该在初始化列表中使用初始化的 lis 来创建初始化矩阵。从语法的角度我该怎么做?

Chr*_*phe 5

这与您用于 的原理相同Vector,但遍历列表列表:

Matrix(initializer_list<initializer_list<double>> lst) : 
                                   row{lst.size()}, 
                                   col{0}   // not sure if all cols are same size
{
    for (auto &x: lst)     // iterate through outer list to find largest inner list
        if (x.size()>col)
            col = x.size();
    cout<<row<<"x"<<col<<endl;   // educational purpose only -> remove
    elem=new double*[row];       
    auto it=lst.begin();         // iterate through outer list 
    for (int i=0; i<row; i++, it++) {
        elem[i]=new double[col];    
        std::copy(it->begin(),it->end(),elem[i]); // copy current inner list
    }
}
Run Code Online (Sandbox Code Playgroud)

有了这个,您可以处理 2D 列表,例如:

Matrix m{ {1,2,3},{4,5,6},{7,8,9}}; 
Run Code Online (Sandbox Code Playgroud)

在线演示

重要说明: 手动管理内存总是很痛苦并且容易出错。使用std::vector而不是指向动态分配的数组的指针会更容易。对于矩阵,您可以在向量向量或带有某些公式的扁平向量之间进行选择,以查找给定行和列的元素。