在C++中,假设我们有两个数组:
a[5] = {1,2,3,4,5};
b[5] = {5,4,3,2,1};
如果我们想要将a设置为b,而不使用循环,该怎么做呢?
我的想法是使用递归,但我不确定如何实现。
编辑:抱歉,我应该明确一点,我不想使用标准库函数(包括一些你们提到的memcpy)。
int a[5] = {1,2,3,4,5};
int b[5] = {5,4,3,2,1};
memcpy(a, b, sizeof(a));
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;
使用递归:
void copy(int *a, int *b, int b_size) {
if(b_size == 0) return;
*a = *b;
copy(++a, ++b, b_size-1);
}
虽然我不理解递归的必要性,但是使用memcpy()
会更好。
memcpy()
:memcpy(a, b, sizeof(a));
memcpy
可以使用,但你也可以使用 memmove
,它不会因为存在重叠的内存位置而出现问题(在你的示例中可能不太可能出现,但如果你将逻辑应用于“克隆”函数之类的操作时,可能会发生这种情况)。
memmove( a, b, sizeof(a) );
当然,如果您确定源和目标不重叠,则使用memcpy
是可以的。
std::array
和a = b;
。 - chrisstd::array<T,N>
的工作原理。 - Charles L Wilcox