53

我经常发现自己想要复制具有恒定大小的数组的内容,我通常只写以下内容:

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(datatype) 相乘,这可能会变得很难看。

由于我正在编写一个我将大量使用的数学库,因此性能对我来说非常重要。今天的编译器是否足够聪明,能够理解第一个示例只是复制一块内存并将其优化为与第二个解决方案一样高效?

也许标准库中有一个可以帮助我的函数?c++11有什么新东西吗?还是我应该只创建一个宏或模板函数?

4

5 回答 5

80

如果你使用std::array而不是内置数组(你应该这样做),它变得非常简单。复制数组与复制任何其他对象相同。

std::array<float,4> a = {0,1,2,3};
std::array<float,4> b = a;
于 2012-09-08T05:41:51.857 回答
54

C++03 方式

使用std::copy()

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

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

这几乎是干净的。

C++11 方式

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

如果你可以使用 std::array

std::array你一起做简单的任务:

std::array<float,4> a = {0,1,2,3};
auto b = a;
于 2012-09-08T05:39:01.207 回答
21

对于对 C++03(以及 C)解决方案感兴趣 - 始终使用包含数组的结构而不是单独的数组:

struct s { float arr[5]; };

默认情况下,结构是可复制的。

已经提到了它在 C++11 中的等价物,std::array<float,5>;

于 2012-09-08T10:22:04.930 回答
4

下面的方法也适用于普通数组以及 std:array。

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

std::copy(std::begin(a), std::end(a), b);
于 2017-08-30T11:25:18.720 回答
2
#include <algorithm>
std::copy_n(a, 4, b)
于 2012-09-08T07:22:21.563 回答