在C ++中我们说有两个数组:
a[5] = {1,2,3,4,5};
b[5] = {5,4,3,2,1};
如果我们想要设置等于b,那么我们如何在不使用循环的情况下实现呢?
我的想法是使用递归,但我不确定如何。
编辑:对不起,应该说清楚我不想使用标准库函数(包括你们有些人提到过的memcpy)
答案 0 :(得分:16)
int a[5] = {1,2,3,4,5};
int b[5] = {5,4,3,2,1};
memcpy(a, b, sizeof(a));
答案 1 :(得分: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;
答案 2 :(得分:7)
使用递归:
void copy(int *a, int *b, int b_size) {
if(b_size == 0) return;
*a = *b;
copy(++a, ++b, b_size-1);
}
我不理解递归的必要性,使用memcpy()
代替更好。
答案 3 :(得分:6)
您可以使用memcpy()
:
memcpy(a, b, sizeof(a));
答案 4 :(得分:4)
memcpy
可以使用memmove
,如果您有重叠的内存位置(在您的示例中不太可能,但是如果您是“克隆”功能的逻辑),那么它也不会轻易爆炸例如它可能发生。)
memmove( a, b, sizeof(a) );
当然,如果您确定您的来源和目的地不重叠,那么memcpy
就可以了。