Подтвердить что ты не робот

Самый чистый способ скопировать массив с постоянным размером в С++ 11

Я часто обнаруживаю, что хочу скопировать содержимое массивов с постоянным размером, я обычно пишу что-то по строкам:

float a[4] = {0,1,2,3};
float b[4];

for(int i=0; i<4; i++){
    b[i]=a[i];
}

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

Первое, что мне пришло в голову, было использование memcpy:

memcpy(b, a, sizeof(float) * 4);

Но это кажется очень похожей на C и ошибкой, склонной ко мне. Мне нравится иметь свои ошибки во время компиляции, и это может стать уродливым для типов данных с нетривиальными конструкторами копирования или если я забуду размножаться с sizeof (тип данных).

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

Возможно, есть функция в стандартной библиотеке, которая может мне помочь? Что-то новое в С++ 11? Или я должен просто создать макрос или функцию шаблона?

4b9b3361

Ответ 1

Если вы используете std::array вместо встроенного массива (что вам нужно), это становится очень простым. Копирование массива тогда совпадает с копированием любого другого объекта.

std::array<float,4> a = {0,1,2,3};
std::array<float,4> b = a;

Ответ 2

С++ 03 будет использовать std::copy():

float a[4] = {0,1,2,3};
float b[4];

std::copy(a,a + 4, b);

Это так же чисто, как и получается. На С++ 11 предпочитают

std::copy(std::begin(a), std::end(a), std::begin(b));

Или еще лучше, используйте std:: array и получите назначение бесплатно:

std::array<float,4> a = {0,1,2,3};
auto b = a;

Ответ 3

Заинтересованность в решении С++ 03 (а также C) - всегда используйте структуру, содержащую массив, а не только массив:

struct s { float arr[5]; };

Структуры могут быть скопированы по умолчанию.

Его эквивалент в С++ 11 уже упоминался, std::array<float,5>;

Ответ 4

#include <algorithm>
std::copy_n(a, 4, b)

Ответ 5

Ниже метод работает для обычных массивов, а также std: array.

float a[4] = {0,1,2,3};
float b[4];

std::copy(std::begin(a), std::end(a), b);