嵌套初始化列表 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;
    }
}