C ++ Как создать std :: список массивов? - PullRequest
3 голосов
/ 17 февраля 2020

У меня есть класс, который содержит 2D-массив.

int arr[3][3];

Как бы я go о сохранении этой матрицы в std :: list?

list<*> explored;

explored.pushback(classname->arr);

Я думал, может быть, потому что я уже знал размер массивов, я просто создал бы список указателей с чем-то вроде выше, но это, очевидно, не работает. Как бы я инициализировал список? Как мне go получить индивидуальный доступ к двумерным массивам?

Редактировать: я хотел получить список из нескольких двумерных массивов. Значение каждой позиции индекса будет содержать массив. Чтобы решить мою проблему, я решил создать класс, в котором класс будет содержать матрицу. Тогда я бы просто получил матрицу, выполнив что-то вроде

Class Node{
    Int matrix[3][3];
}
//Store a node with a matrix inside of it.
list<node> v;
v.pushback(node);


//retrieve the matrix by iterating to that position in the list then
v.matrix;

Ответы [ 2 ]

8 голосов
/ 17 февраля 2020

Как мне go хранить эту матрицу в std :: list?

Вы не можете хранить необработанные массивы в std::list.

Из https://en.cppreference.com/w/cpp/container/list,

T должны соответствовать требованиям CopyAssignable и CopyConstructible (до C ++ 11).

Требования, предъявляемые к элементам, зависят от фактических операций, выполняемых над контейнером. Как правило, требуется, чтобы тип элемента был полным типом и отвечал требованиям Стираемый , но многие функции-члены предъявляют более строгие требования (начиная с C ++ 11, до C ++ 17 ).

Необработанные массивы не соответствуют ни одному из этих требований.

Однако вы можете использовать:

  1. std::list из std::array.
  2. Создайте struct, который содержит массив, а затем используйте std::list из struct.

Если вы не собираетесь добавлять какое-либо поведение в массив, я бы порекомендовал используя первый вариант.

1 голос
/ 17 февраля 2020
using namespace std;

list<list<int>> matrix;
for (int row = 0; row < 3; row++) 
{
     std::list<int> rowList;
     for (int col = 0; col < 3; col++)
     {
          rowList.push_back(arr[row][col]);             
     }
     matrix.push_back(rowList);
}

Поскольку к элементам матрицы более традиционно обращаются напрямую (например, к массиву), std::vector на самом деле имеет больше смысла. Аналогично приведенному выше, за исключением того, что замените list на vector.

vector<vector<int>> matrix;
matrix.resize(3);
for (int row = 0; row < 3; row++) 
{
     auto& row = matrix[row];
     row.resize(3);
     for (int col = 0; col < 3; col++)
     {
         row[col] = arr[row][col];             
     }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...