Как вставить массив в массив на языке С++?

103
11 января 2020, 06:50

У меня есть 2 массива вида:

int b1[5] = {1,2,3,4,5};
int b2[5] = {6,7,8,9,10};

Я хочу вставить эти массивы в другой массив

int ary[2][5] = {b1,b2}; 

Но я получаю ошибку значение типа "int*" нельзя использовать для инициализации типа int

Answer 1

В языке С++ также как и в Си элементы многомерных массивов хранятся в памяти последовательно. Но не факт, что два одномерных массива будут находится рядом друг с дружкой. Чтобы получить новый двумерный массив с элементами двух исходных, придётся их содержимое копировать.

int ary[2][5];
memcpy(ary[0], b1, sizeof(b1));
memcpy(ary[1], b2, sizeof(b2));

Пример работы: https://ideone.com/Cd0oqS

Конструкция sizeof вычисляет количество байтов, сколько занимает каждый из массивов.

Нужно учесть, что с помощью функции memcpy из Си в коде на С++ можно копировать только POD типы данных. int к таковым относится.

Answer 2

В языке С++ в тех ситуациях, когда вам нужен обычный С-массив, рекомендуется пользоваться его аналогом - классом std::array. Класс std::array в том числе как раз и предназначен для решения проблемы некопируемости С-массивов

std::array<int, 5> b1 = { 1, 2, 3, 4, 5 };
std::array<int, 5> b2 = { 6, 7, 8, 9, 10 };
std::array<std::array<int, 5>, 2> ary = { b1, b2 }; 
Answer 3

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

https://ideone.com/8AjUUn

#include <iostream>
using namespace std;
int main()
{
  int b1[5] = {1,2,3,4,5};
  int b2[5] = {6,7,8,9,10};
  int *a[2] = {b1, b2};
  for (size_t q=0; q<2; ++q)
  {
    for (size_t w=0; w<5; ++w)
      cout << a[q][w] << ' ';
    cout << endl;
  }
  return 0;
}
READ ALSO
Двойное условие на сигнал в connect

Двойное условие на сигнал в connect

Можно ли сделать двойное условие на сигнал (например, при нажатии на кнопку в одном случае срабатывала одна функция, а при другом - другая)...

111
Когда удаляется static поле класса?

Когда удаляется static поле класса?

В какой момент будет удалено статическое поле класса, если деструктор класса виртуальный?

111