C ++在Struct中使用默认值

时间:2016-09-16 19:07:38

标签: c++ c++11 vector instantiation

使用C ++ 11,我最初有一个以下形式的二维矢量,默认值为:

vector<vector<int>> upper({{1,2,3,4,5,6},{7,8,9,10,11,-1},{12,13,14,15,-1,-1},{16,17,18,-1,-1,-1},{19,20,-1,-1,-1,-1},{21,-1,-1,-1,-1,-1}});
vector<vector<int>> lower({{0,0,0,0,0,0},{0,0,0,0,0,-1},{0,0,0,0,-1,-1},{0,0,0,-1,-1,-1},{0,0,-1,-1,-1,-1},{0,-1,-1,-1,-1,-1}});

这代表了我试图解决的谜题的上下部分。现在我想修改我的程序,使这些向量在结构中声明,但我不知道如何做到这一点并给出2d向量的默认值。这就是我现在所拥有的:

struct BoardState{
vector<int> row;
vector<vector<int>> upper;
vector<vector<int>> lower;

BoardState() : row(6,0), upper(6,row), lower(6,row) {};
};

但是当我尝试使用以下内容访问内部时会导致seg错误:

#include <iostream>
#include <vector>
#include <stdlib.h>

BoardState *board;
int main(){
            using namespace std;
            ...
            for(int i=0; i<6; i++){
                for(int j=0; j<6; j++){
                    cout << board->upper[i][j] << " ";
                }
                cout << endl;
            }

}

如何为结构内的2d向量赋予默认值?感谢。

2 个答案:

答案 0 :(得分:1)

来自gcc warning" 'will be initialized after'

  

确保成员以相同的顺序出现在初始化列表中   因为他们出现在课堂上。

编辑:

#include <iostream>
#include <vector>
using namespace std;

struct BoardState{
vector<int> row;
vector<vector<int>> upper;
vector<vector<int>> lower;
BoardState() : row(6,0), upper(6,row), lower(6,row) {};
};

int main() {
    BoardState board;
    for(int i=0; i<6; i++){
        for(int j=0; j<6; j++){
            cout << board.upper[i][j] << " ";
        }
        cout << endl;
    }
}

答案 1 :(得分:0)

  

我不知道如何做到这一点并给出2d向量的默认值。

正好在结构之外

#include <vector>
#include <iostream>

struct BoardState
 {
   std::vector<std::vector<int>> upper{{1,2,3,4,5,6},{7,8,9,10,11,-1},
                                       {12,13,14,15,-1,-1},{16,17,18,-1,-1,-1},
                                       {19,20,-1,-1,-1,-1},{21,-1,-1,-1,-1,-1}};
   std::vector<std::vector<int>> lower{{0,0,0,0,0,0},{0,0,0,0,0,-1},
                                       {0,0,0,0,-1,-1},{0,0,0,-1,-1,-1},
                                       {0,0,-1,-1,-1,-1},{0,-1,-1,-1,-1,-1}};
   std::vector<int> row;

   BoardState()
    { }
 };

int main()
 {
   BoardState bs;

   std::cout << bs.upper[3][1] << std::endl;   // print 17
 }

struct BoardState
 {
   std::vector<int> row {6, 0};
   std::vector<std::vector<int>> upper {6, row};
   std::vector<std::vector<int>> lower {6, row};

   BoardState()
    { }
 };

(在这种情况下,请打印0)。

根据ArchbishopOfBanterbury和Petter的解释,会员按照他们宣布的顺序进行初始化;因此,如果您想使用upper初始化lowerrow,则必须先申报row