Установить массив1 = массив2 в C ++ - PullRequest
5 голосов
/ 03 марта 2020

У меня есть один инициализированный массив arr1 и один объявленный массив arr2. Как я могу просто установить arr2 = arr1?

void setup() {

  int arr1[5][2]= { {1,1},
                    {1,2}};

  int arr2[5][2];


  arr2 = arr1; // Throws error "invalid array assignment"
}

Возможно ли это сделать в C ++? И если да, то как? Я бы хотел не использовать для этого циклы.

Ответы [ 5 ]

6 голосов
/ 03 марта 2020

Массивы не могут быть назначены, но они могут быть скопированы (используя, например, std::copy или std::memcpy).

Возможно, лучшим решением будет использование std::array вместо этого, так как тогда вы сможете использовать простое и простое назначение:

std::array<std::array<int, 2>, 5> arr1 = {{
    { 1, 1 },
    { 1, 2 }
}};

std::array<std::array<int, 2>, 5> arr2;
arr2 = arr1;
6 голосов
/ 03 марта 2020

Вы не можете назначить C массивов таким способом, но вы можете назначить std::array s и std::vector s:

auto a1 = std::vector<std::vector<int>>{{1, 1}, {1, 2}};
auto a2 = a1;

(std::array s работают так же, но более подробный, так как вам нужно указать количество измерений в качестве аргументов шаблона.)

В этом примере выполняется построение копии, а не присваивание, что вам и нужно использовать в 99% случаев. Назначение также работает, точно так же.

Стоит отметить, что это , а не многомерный массив - это вложенный массив . В C ++ нет собственного типа для многомерных массивов, но их предоставляют различные библиотеки (в основном для численных вычислений), например Eigen и xtensor . Они могут показаться внешне похожими на вложенные массивы, но их API и их реализация существенно различаются. Примечательно, что они располагаются непрерывно в памяти, а вложенные векторы отсутствуют (хотя вложенные std::array s равны ).

5 голосов
/ 03 марта 2020

Использовать std :: array:

void setup() {

  std::array<std::array<int, 2>, 2> arr1= { {1,1},
                    {1,2}};

  std::array<std::array<int, 2>, 2> arr2;


  arr2 = arr1;
}
5 голосов
/ 03 марта 2020

Самое простое решение - использовать C ++, а не C.

  std::array<std::array<int,5>,5> arr1 =
     { {1,1},
       {1,2} };

  auto arr2 = arr1;
4 голосов
/ 03 марта 2020

Используйте std::array вместо необработанных C массивов: это POD, и его можно копировать (назначение копирования; перезаписывает каждый элемент массива соответствующим элементом другого массива) естественным образом:

#include <array>
#include <iostream>

int main() {
    using ArrayType = std::array<std::array<int, 2>, 3>;
    ArrayType arr{{
        {1, 2},
        {3, 4},
        {5, 6}
    }};

    ArrayType arr_copy;

    // Copy arr into arr_copy.
    arr_copy = arr;

    // Mutation of original array will not affect the
    // elements of the copy.
    arr[0][0] = 42;
    std::cout << arr_copy[0][0]; // 1 (original value)

    return 0;
}
...