如何使用intitializer列表?

时间:2015-09-21 18:08:16

标签: c++

编辑:无法使用矢量

所以现在我正在练习课程和标题。我需要做的一件事是创建一个可以使用初始化列表初始化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}}的操作,这样我就可以创建我的Matrix --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因为它是速记。

2 个答案:

答案 0 :(得分: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::vector代替原始数组。 std::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 

答案 1 :(得分:1)

没有理由通过引用来获取std::initializer_list。无论如何,它将会建造到位。并且您实际上并不需要构造函数的主体,因为您可以使用std::vector迭代器构造函数。

我建议简单地说:

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