7

在 C++ 中说我们有两个数组:

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

例如,如果我们想设置 a 等于 b,我们如何在不使用循环的情况下实现呢?

我的想法是使用递归,但我不确定如何使用。

编辑:对不起,应该明确表示我不想使用标准库函数(包括你们中的一些人提到的 memcpy)

4

5 回答 5

17
int a[5] = {1,2,3,4,5};
int b[5] = {5,4,3,2,1};

memcpy(a, b, sizeof(a));
于 2012-10-24T17:14:47.840 回答
11

您可以使用标准库中的复制算法。

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

std::begin并且std::end在 C++ 标准库中是新的,但是对于还不支持它们的编译器来说,它们很容易实现:

template <typename T, std::size_t N>
T* begin(T(&a)[N]) {
    return &a[0];
}
template <typename T, std::size_t N>
T* end(T(&a)[N]) {
    return begin(a) + N;
}

或者,您可以使用std::array(或旧编译器的 Boost 等效项)和赋值运算符:

std::array<int, 5> a = {1,2,3,4,5};
std::array<int, 5> b = {5,4,3,2,1};
a = b;
于 2012-10-24T17:13:39.700 回答
7

使用递归:

void copy(int *a, int *b, int b_size) {
     if(b_size == 0) return;    
     *a = *b;
     copy(++a, ++b, b_size-1);
}

不过,我不明白递归的必要性,使用memcpy()代替更好。

于 2012-10-24T17:14:57.537 回答
6

你可以使用memcpy()

memcpy(a, b, sizeof(a));
于 2012-10-24T17:13:37.580 回答
4

memcpy有效,但memmove如果您有重叠的内存位置(在您的示例中不太可能,但如果您使用“克隆”功能的逻辑,例如它可能发生),您也可以使用它。

memmove( a, b, sizeof(a) );

当然,如果您确定您的来源和目的地不重叠,那么memcpy很好。

于 2012-10-24T17:25:17.537 回答