Самый чистый способ скопировать массив с постоянным размером в С++ 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? Или я должен просто создать макрос или функцию шаблона?
Ответы
Ответ 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);