我正在开发一个代表15-puzzle(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 } } ;
有谁知道如何构建这样的构造函数?感谢
答案 0 :(得分:2)
我设法使用初始化列表,以及如果有人对此感兴趣:
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;
}
}
答案 1 :(得分:1)
尝试更改您的课程以改为使用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)
{
}