编辑:无法使用矢量
所以现在我正在练习课程和标题。我需要做的一件事是创建一个可以使用初始化列表初始化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因为它是速记。
答案 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
的一个可用构造函数采用begin
和end
迭代器,可用于std::initializer_list
。
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()}
{ }