Заполнение 2d вектора, содержащего скракт - PullRequest
0 голосов
/ 02 июня 2018

У меня есть небольшая структура, содержащая bool, char и два целых числа.Но когда я пытаюсь запустить этот код, я сталкиваюсь с проблемой.

struct Struct
{
  bool check;
  char display;
  int x,y;
};

typedef vector<Struct> Array;

vector<Array> Matrix;

for (int i = 0; i < rows; i++)
{
    vector<Struct> temp;

    for (int j = 0; j < cols; j++)
    {
        temp[i].push_back(Matrix);
    }

    Matrix.push_back(temp);
}

Я хочу заполнить свой 2D-массив, чтобы позже я мог написать что-то в терминах:

for (int i = 0; i < rows; i++)
{
    for (int j = 0; j < cols; j++)
    {

            Matrix[i][j].display = '*';

    }

}

Однако на данный момент я получаю сообщение об ошибке: «temp не имеет члена push_back ()».

Ответы [ 6 ]

0 голосов
/ 02 июня 2018

Чтобы упростить обработку данных, вы также можете назначать значения посредством инициализации структуры, а не члена за раз, например,

    std::vector<std::vector<Struct>> matrix;    /* declare matrix */

    for (int i = 0; i < ROWS; i++) {        /* loop ROWS times */
        std::vector<Struct> v;              /* declare vector of Struct */
        for (int j = 0; j < COLS; j++) {    /* loop COLS times */
            Struct s = { 1, '*', i, j };    /* initialize struct */
            v.push_back (s);                /* push_back to vector */
        }
        matrix.push_back(v);    /* push back to matrix */
    }

Оборачивая это в кратком примере, вы могли бы сделать что-топохож на:

#include <iostream>
#include <vector>

#define ROWS  10
#define COLS  ROWS

struct Struct {
    bool check;
    char display;
    int x,y;
};

int main (void) {

    std::vector<std::vector<Struct>> matrix;    /* declare matrix */

    for (int i = 0; i < ROWS; i++) {        /* loop ROWS times */
        std::vector<Struct> v;              /* declare vector of Struct */
        for (int j = 0; j < COLS; j++) {    /* loop COLS times */
            Struct s = { 1, '*', i, j };    /* initialize struct */
            v.push_back (s);                /* push_back to vector */
        }
        matrix.push_back(v);    /* push back to matrix */
    }

    for (auto& i : matrix) {    /* auto-range loop over matrix  */
        for (auto& j : i)       /* auto-range loop over vectors */
            std::cout << j.x << ',' << j.y << "  check: " << j.check <<
                    "  display: '" << j.display << "'\n";
        std::cout << '\n';  /* tidy up with newline between vectors */
    }
}

Пример использования / вывода

$ ./bin/vect2d_struct
0,0  check: 1  display: '*'
0,1  check: 1  display: '*'
0,2  check: 1  display: '*'
0,3  check: 1  display: '*'
0,4  check: 1  display: '*'
0,5  check: 1  display: '*'
0,6  check: 1  display: '*'
0,7  check: 1  display: '*'
0,8  check: 1  display: '*'
0,9  check: 1  display: '*'

1,0  check: 1  display: '*'
1,1  check: 1  display: '*'
1,2  check: 1  display: '*'
1,3  check: 1  display: '*'
1,4  check: 1  display: '*'
... <snip>
8,5  check: 1  display: '*'
8,6  check: 1  display: '*'
8,7  check: 1  display: '*'
8,8  check: 1  display: '*'
8,9  check: 1  display: '*'

9,0  check: 1  display: '*'
9,1  check: 1  display: '*'
9,2  check: 1  display: '*'
9,3  check: 1  display: '*'
9,4  check: 1  display: '*'
9,5  check: 1  display: '*'
9,6  check: 1  display: '*'
9,7  check: 1  display: '*'
9,8  check: 1  display: '*'
9,9  check: 1  display: '*'

Просмотрите все и дайте мне знать, если это то, что вы хотели, и если у вас естьлюбые дальнейшие вопросы.

0 голосов
/ 02 июня 2018

Вы можете просто использовать resize () с вектором строки по умолчанию для элементов по умолчанию:

matrix.resize(rows,·vector<Struct>(cols));

Ниже приведен пример в C ++ 11 с очисткой () перед resize () для повторного запускасо значениями по умолчанию уже используемая матрица.

#include <vector>

using namespace std;

struct Struct {
    bool check = false;
    char display = '\0';
    int x = 0, y = 0;
};

void init_matrix(vector<vector<Struct>>& matrix, size_t rows, size_t cols)
{
    matrix.clear();
    matrix.resize(rows, vector<Struct>(cols));
}
0 голосов
/ 02 июня 2018

Используйте этот тип механизма для создания 2D массива структуры.

vector < vector<Struct>> xyz;
vector<Struct> abc;

    //set value ++++++++
    Struct _st;
    _st.check = true;
    _st.display = NULL;
    _st.x = 10;
    _st.y = 10;
    //set value --------

abc.push_back(_st);
xyz.push_back(abc);
0 голосов
/ 02 июня 2018

Как уже упоминалось выше, вы пытаетесь вызвать push_back() для типа Struct, а не для типа std::vector<Struct>, поэтому ваш компилятор жалуется на то же самое.Попробуйте ниже:

void initMatrix(int rows, int cols)
{
    for (int i = 0; i < rows; i++)
    {
        Array temp;
        for (int j = 0; j < cols; j++)
        {
            Struct s;
            // Struct s = initStruct(); // if you want to initialize with other values
            temp.push_back(s);
        }

        Matrix.push_back(temp);
    }
}
0 голосов
/ 02 июня 2018

Вы смешиваете типы, и ваш компилятор выдает ошибку:

typedef vector<Struct> Array; 

vector<Array> Matrix; // a vector of vectors

for (int i = 0; i < rows; i++) {
    vector<Struct> temp;

    for (int j = 0; j < cols; j++)
    {
       // temp[i].push_back(Matrix); -> wrong  
       // Matrix is a vector of vectors.
       // but temp is a vector of structs.
       temp.push_back(Struct()); 
    }

    Matrix.push_back(temp); //push the vector into the vector 
}
0 голосов
/ 02 июня 2018

Вы имеете в виду temp[i].Поскольку temp не является массивом или вектором векторов, его нельзя использовать таким образом.Когда вы делаете temp[i], вы получаете i'th элемент вектора temp, который является Struct, у которого нет метода push_back.

Вы можете сделать что-то подобное для инициализации Matrix:

....
for (int i = 0; i < rows; i++)
{
    vector<Struct> temp;

    for (int j = 0; j < cols; j++)
    {
        Struct s;
        s.check = true;
        s.display = 'c';
        s.x = i;
        s.y = j;  
        temp.push_back(s);
    }

    Matrix.push_back(temp);
}
....
...