嵌套初始化列表c ++

时间:2015-05-18 23:35:08

标签: c++ constructor initializer-list

我正在开发一个代表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 } } ;

有谁知道如何构建这样的构造函数?感谢

2 个答案:

答案 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)
{
}