如何在结构内初始化2D矢量?

时间:2018-03-24 07:00:16

标签: c++

我需要一个包含2D矢量的结构。如下所示

struct state
{
    vector<vector<int> > p(3,vector<int>(3));
};
state *puzzle;

但是我收到以下错误:

  

9 25 C:\ Users \ Nikita \ Documents \ AI_8square_heuristic1.cpp [Error] expect','或'...'在数字常量之前

有人可以告诉我如何初始化矢量?  谢谢。

2 个答案:

答案 0 :(得分:1)

您可以简单地创建默认构造函数,并使用member initialization list初始化向量:

#include <vector>
struct state
{
    std::vector<std::vector<int> > p;
    state() : p(3,std::vector<int>(3)) {}
};

答案 1 :(得分:0)

您的初始化也可以通过将括号替换为大括号来实现,例如:

struct state
{
    vector<vector<int>> p{3,vector<int>(3)};
};

很好。

现在你如何使用它可能是一个问题。最初,您显示声明指向state的指针,例如state *puzzle;但是,这需要您为实例分配存储空间。相当容易做到。您只需要以下内容:

#include <iostream>
#include <vector>

using namespace std;

struct state
{
    vector<vector<int>> p{3,vector<int>(3)};
};

int main(void)
{
    state *puzzle = new (state);

    for (auto& i : puzzle->p)    /* fill vectors */
        for (auto& j : i)
            cin >> j;

    for (auto& i : puzzle->p) {  /* display values */
        for (auto& j : i)
            cout << " " << j;
        cout  << '\n';
    }
}

但是,<vector>类型提供了自动内存管理,因此无需首先声明指针。 <vector>提供了一个智能指针,用于在实例超出范围时处理释放。因此,除非您要求使用指针,否则只需将stat的实例声明为拼图,例如:

#include <iostream>
#include <vector>

using namespace std;

struct state
{
    vector<vector<int>> p{3,vector<int>(3)};
};

int main(void)
{
    state puzzle;

    for (auto& i : puzzle.p)    /* fill vectors */
        for (auto& j : i)
            cin >> j;

    for (auto& i : puzzle.p) {  /* display values */
        for (auto& j : i)
            cout << " " << j;
        cout  << '\n';
    }
}

无论选择哪种方法,都提供完全相同的输出(当前依赖于您尝试不再使用最初请求的值,除非您使用vector成员函数添加到现有实例,例如使用push_back()成员等。

两者都提供相同的输出,例如

*示例输入文件**

$ cat dat/2dvals.txt
7 5 16
2 4 6
3 8 9

示例使用/输出

$ ./bin/vect2dinit_cin <dat/2dvals.txt
 7 5 16
 2 4 6
 3 8 9

仔细看看,如果您有其他问题,请告诉我。