嵌套初始化列表 C++
Nested initializer list c++
我正在研究以下 class 代表 15 拼图 (http://en.wikipedia.org/wiki/15_puzzle) :
class fifteen
{
private:
static constexpr size_t dimension = 4;
using position = std::pair< size_t, size_t > ;
public:
size_t table [ dimension ][ dimension ];
size_t open_i;
size_t open_j;
public:
fifteen( );
fifteen( std::initializer_list< std::initializer_list< size_t >> init );
...
}
我正在尝试使用给定的初始化列表构建构造函数,但是我卡住了,因为我不知道如何处理此类嵌套的初始化列表。默认构造函数如下所示:
fifteen::fifteen()
:open_i(3), open_j(3)
{
for(auto i = 0; i < 16; i++)
table [i/4] [i%4] = i+1
}
初始化列表一会这样使用:
fifteen f{ { 1, 3, 4, 12 }, { 5, 2, 7, 11 }, { 9, 6, 14, 10 }, { 13, 15, 0, 8 } } ;
有谁知道如何构建这样的构造函数?谢谢
尝试将您的 class 更改为使用 std::array
。将 table
更改为 std::array<std::array<size_t, 4> 4>
,并更改您的构造函数以将 std::array<std::array<size_t, 4>, 4>
作为输入。大括号初始化可以与 std::array
一起使用,因此您的构造函数调用应该能够保持不变,但是构造 table
的后端逻辑会有所不同,编译器将能够更好地验证维度输入的。
尝试这样的事情:
class fifteen
{
private:
using position = std::pair< size_t, size_t > ;
public:
static constexpr size_t dimension = 4;
using tablearr = std::array< std::array< size_t, dimension >, dimension >;
tablearr table;
size_t open_i;
size_t open_j;
public:
fifteen( );
fifteen( tablearr const &init );
//...
}
fifteen::fifteen()
:open_i(3), open_j(3)
{
for(auto i = 0; i < 16; i++)
table[i/4][i%4] = i+1;
}
fifteen::fifteen(tablearr const &init)
: table(init), open_i(3), open_j(3)
{
}
我设法用初始化列表做到了,如果有人感兴趣的话,下面是方法:
fifteen( std::initializer_list< std::initializer_list< size_t >> init )
{
int pos_i = 0;
int pos_j = 0;
for(auto i = init.begin(); i != init.end(); ++i)
{
for(auto j = i->begin(); j!= i->end(); ++j)
{
table [pos_i][pos_j] = *j;
pos_j++;
}
pos_i++;
pos_j = 0;
}
}
我正在研究以下 class 代表 15 拼图 (http://en.wikipedia.org/wiki/15_puzzle) :
class fifteen
{
private:
static constexpr size_t dimension = 4;
using position = std::pair< size_t, size_t > ;
public:
size_t table [ dimension ][ dimension ];
size_t open_i;
size_t open_j;
public:
fifteen( );
fifteen( std::initializer_list< std::initializer_list< size_t >> init );
...
}
我正在尝试使用给定的初始化列表构建构造函数,但是我卡住了,因为我不知道如何处理此类嵌套的初始化列表。默认构造函数如下所示:
fifteen::fifteen()
:open_i(3), open_j(3)
{
for(auto i = 0; i < 16; i++)
table [i/4] [i%4] = i+1
}
初始化列表一会这样使用:
fifteen f{ { 1, 3, 4, 12 }, { 5, 2, 7, 11 }, { 9, 6, 14, 10 }, { 13, 15, 0, 8 } } ;
有谁知道如何构建这样的构造函数?谢谢
尝试将您的 class 更改为使用 std::array
。将 table
更改为 std::array<std::array<size_t, 4> 4>
,并更改您的构造函数以将 std::array<std::array<size_t, 4>, 4>
作为输入。大括号初始化可以与 std::array
一起使用,因此您的构造函数调用应该能够保持不变,但是构造 table
的后端逻辑会有所不同,编译器将能够更好地验证维度输入的。
尝试这样的事情:
class fifteen
{
private:
using position = std::pair< size_t, size_t > ;
public:
static constexpr size_t dimension = 4;
using tablearr = std::array< std::array< size_t, dimension >, dimension >;
tablearr table;
size_t open_i;
size_t open_j;
public:
fifteen( );
fifteen( tablearr const &init );
//...
}
fifteen::fifteen()
:open_i(3), open_j(3)
{
for(auto i = 0; i < 16; i++)
table[i/4][i%4] = i+1;
}
fifteen::fifteen(tablearr const &init)
: table(init), open_i(3), open_j(3)
{
}
我设法用初始化列表做到了,如果有人感兴趣的话,下面是方法:
fifteen( std::initializer_list< std::initializer_list< size_t >> init )
{
int pos_i = 0;
int pos_j = 0;
for(auto i = init.begin(); i != init.end(); ++i)
{
for(auto j = i->begin(); j!= i->end(); ++j)
{
table [pos_i][pos_j] = *j;
pos_j++;
}
pos_i++;
pos_j = 0;
}
}