嵌套初始化列表c++

Nested initializer list c++

本文关键字:c++ 列表 初始化 嵌套      更新时间:2023-10-16

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

有没有人知道我怎么才能建立这样一个构造函数?由于

我设法用初始化器列表做到了这一点,如果有人感兴趣的话,下面是如何做到的:

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;
    }
}

尝试将您的类改为使用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)
{
}