C ++ Создание экземпляра 2D-вектора внутри Struct со значениями по умолчанию

Используя C ++ 11, у меня изначально был 2-мерный вектор следующей формы со значениями по умолчанию:

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

Это были верхний и нижний компоненты головоломки, которую я пытаюсь решить. Теперь я хочу изменить свою программу таким образом, чтобы эти векторы объявлялись внутри структуры, но я не уверен, как это сделать, и дать значения по умолчанию для 2-мерных векторов. Вот что у меня есть на данный момент:

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

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

Но это вызывает ошибку сегмента, когда я пытаюсь получить доступ к тому, что внутри, используя:

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

}

Как мне задать значения по умолчанию для 2-мерного вектора внутри структуры? Спасибо.


person MetalMagnum    schedule 16.09.2016    source источник
comment
Возможный дубликат предупреждения gcc 'будет инициализирован после'   -  person sjrowlinson    schedule 16.09.2016


Ответы (2)


Я не уверен, как это сделать, и задаю значения по умолчанию для 2-мерных векторов.

Точно так же, как вне структуры

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

or

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).

Учтите, что, как объяснили архиепископ Бантербери и Петтер, члены инициализируются в том порядке, в котором они объявлены; поэтому, если вы хотите инициализировать upper и lower с помощью row, вы должны объявить row раньше.

person max66    schedule 16.09.2016

Из предупреждение gcc 'будет инициализировано после':

Убедитесь, что члены появляются в списке инициализаторов в том же порядке, в каком они появляются в классе.

РЕДАКТИРОВАТЬ:

#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;
    }
}
person Petter    schedule 16.09.2016
comment
Спасибо. Я исправил эту проблему, но по-прежнему получаю ошибку сегмента. - person MetalMagnum; 16.09.2016