Присвоению массиву другой массив

298
09 ноября 2017, 06:21

Нужно массиву double а[n] присвоить массив double b[n]. Как реализовать? Без цикла.

Answer 1

Голые массивы в С++ являются некопируемыми объектами. Они не копируются ни при инициализации, ни через присваивание. (На массивы, обернутые в классы и копируемые неявно и опосредованно вместе с классом, это ограничение не распространяется.)

Поэтому присвоить массив double а[n] массиву double b[n] у вас никак не получится. Либо явный цикл, либо скрытый цикл, типа memcpy, std::copy и т.п.

Разумеется настоящие "кул хацк0ры" не удержатся от соблазна предложить такое решение

int main() 
{
  const unsigned N = 100;
  double a[N] = { 1, 2, 3 };
  double b[N];
  struct S
  {
    double a[N];
  };
  *(S *) b = *(S *) a;
}

но с точки зрения языка С++ такой код нарушает правила aliasing и его поведение не определено.

Answer 2

Внимание, этот код работает только для массивов, но не для указателей:

memcpy(b, a, sizeof a);

https://ideone.com/gaTiyU

#include <cstdio>
#include <memory.h>
using namespace std;
int main() 
{
  const unsigned N = 8;
  double a[N] = { 1, 2, 3 };
  double b[N];
  memcpy(b, a, sizeof a);
  for (unsigned q=0; q<N; ++q)
    printf("%lf ", b[q]);
  return 0;
}
Answer 3

Начиная с С++11 стандарта появилась новая реализация std::swap

template< class T2, size_t N >
void swap( T2 (&a)[N], T2 (&b)[N]);

Применение:

int a[] = {1,2,3};
int b[] = {4,5,6};
swap(a,b);

Важно, внутри всё равно будет полноценное копирование за O(n).

Из плюсов данного метода - можно использовать и для указателей.

ссылка

READ ALSO
Сортировка Структуры [требует правки]

Сортировка Структуры [требует правки]

Нужна помощь с сортировкой

302
Проблемы с подключением библиотек Qt C++

Проблемы с подключением библиотек Qt C++

Только недавно начал изучать qt, но проблема в том, что он не находить библиотекРугается в пресловутом hello world'идке, который я взял из книги...

275
Вызов функции из std::function

Вызов функции из std::function

Есть примитивный класс:

268
Методы уже определены в *.obj

Методы уже определены в *.obj

Добрый день, первый раз столкнулся с такой проблемойПри компиляции вылазит следующее для каждого метода:

272