不使用循环将一个数组设置为另一个数组的值

9

在C++中,假设我们有两个数组:

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

如果我们想要将a设置为b,而不使用循环,该怎么做呢?
我的想法是使用递归,但我不确定如何实现。
编辑:抱歉,我应该明确一点,我不想使用标准库函数(包括一些你们提到的memcpy)。

结果是什么?a == {5, 4, 3, 2, 1} - Max
2
你可以使用 std::arraya = b; - chris
你是想将 b 赋值给 a 还是测试它们是否相等?你能否澄清一下,因为你没有展示你想要的操作的代码? - πάντα ῥεῖ
根据编辑更新了我的答案。 - max
1
为什么不能使用循环?如果你不解释这个限制的原因,你可能会得到一些无法帮助你的答案。 - Robᵩ
如果您可以重新定义数组,将数组作为新结构类型的唯一成员,那么该结构的默认赋值运算符将提供此功能;这就是C++03 TR1的std::array<T,N>的工作原理。 - Charles L Wilcox
5个回答

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

memcpy(a, b, sizeof(a));

11
您可以使用标准库中的复制算法。
std::copy(std::begin(b), std::end(b), std::begin(a));

std::beginstd::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;

2
如果我不想使用内置函数,该怎么做? - nan
2
@user1693091 没有内置函数,也没有循环?我不理解这个要求。我可以在站立时使用内置函数,并且只用一只手,但为什么要这样做呢? - R. Martinho Fernandes

7

使用递归:

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

虽然我不理解递归的必要性,但是使用memcpy()会更好。


6
你可以使用 memcpy()
memcpy(a, b, sizeof(a));

它在哪个库中?我似乎在C++中找不到它。 - Daniel Node.js
<cstring> - Peter Gluck

4

memcpy 可以使用,但你也可以使用 memmove,它不会因为存在重叠的内存位置而出现问题(在你的示例中可能不太可能出现,但如果你将逻辑应用于“克隆”函数之类的操作时,可能会发生这种情况)。

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

当然,如果您确定源和目标不重叠,则使用memcpy是可以的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接