是否有一个在C / C ++中复制数组的函数?

时间:2013-04-22 01:05:05

标签: c++ c arrays

我是一名学习C / C ++的Java程序员。所以我知道Java有一个类似System.arraycopy()的函数;复制数组。我想知道C或C ++中是否有复制数组的函数。我只能通过使用for循环,指针等找到复制数组的实现。有没有可以用来复制数组的函数?

11 个答案:

答案 0 :(得分:107)

因为您要求使用C ++解决方案......

#include <algorithm>
#include <iterator>

const int arr_size = 10;
some_type src[arr_size];
// ...
some_type dest[arr_size];
std::copy(std::begin(src), std::end(src), std::begin(dest));

答案 1 :(得分:66)

正如其他人所提到的,在C中你会使用memcpy。但请注意,这会执行原始内存复制,因此如果您的数据结构具有指向自身或彼此的指针,则副本中的指针仍将指向原始对象。

在C ++中,如果您的数组成员是POD(也就是基本上您也可以在C中使用不变的类型),也可以使用memcpy,但一般情况下,memcpy不允许。正如其他人所提到的,使用的功能是std::copy

话虽如此,在C ++中你很少使用原始数组。相反,您应该使用其中一个标准容器(std::vector最接近内置数组,而且我认为最接近Java数组 - 确实比普通C ++数组更接近 - 但是{{1}或std::deque在某些情况下可能更合适)或者,如果使用C ++ 11,std::list非常接近内置数组,但与其他C ++类型一样具有值语义。我在这里提到的所有类型都可以通过赋值或复制构造进行复制。此外,您可以使用迭代器语法从opne“交叉复制”到另一个(甚至是内置数组)。

这概述了可能性(我假设已包含所有相关标题):

std::array

答案 2 :(得分:61)

从C ++ 11开始,您可以使用std::array直接复制数组:

std::array<int,4> A = {10,20,30,40};
std::array<int,4> B = A; //copy array A into array B

以下是有关std::array

的文档

答案 3 :(得分:18)

您可以使用memcpy()

void * memcpy ( void * destination, const void * source, size_t num );

memcpy()num字节的值从source指向的位置直接复制到destination指向的内存块。

如果destinationsource重叠,那么您可以使用memmove()

void * memmove ( void * destination, const void * source, size_t num );

memmove()num字节的值从source指向的位置复制到destination指向的内存块。复制就像使用中间缓冲区一样,允许目标和源重叠。

答案 4 :(得分:15)

在C中使用memcpy,在C ++中使用std::copy

答案 5 :(得分:9)

在C中,您可以使用memcpy。在C ++中,使用std::copy标题中的<algorithm>

答案 6 :(得分:3)

在C ++ 11中,您可以使用适用于std容器的Copy()

template <typename Container1, typename Container2>
auto Copy(Container1& c1, Container2& c2)
    -> decltype(c2.begin())
{
    auto it1 = std::begin(c1);
    auto it2 = std::begin(c2);

    while (it1 != std::end(c1)) {
        *it2++ = *it1++;
    }
    return it2;
}

答案 7 :(得分:2)

我在这里给出了两种处理数组的方法,用于C和C ++语言。 memcpycopy都可用于C ++,但复制不适用于C,如果您要复制数组,则必须使用 memcpy 在C.

#include <stdio.h>
#include <iostream>
#include <algorithm> // for using copy (library function)
#include <string.h> // for using memcpy (library function)


int main(){

    int arr[] = {1, 1, 2, 2, 3, 3};
    int brr[100];

    int len = sizeof(arr)/sizeof(*arr); // finding size of arr (array)

    std:: copy(arr, arr+len, brr); // which will work on C++ only (you have to use #include <algorithm>
    memcpy(brr, arr, len*(sizeof(int))); // which will work on both C and C++

    for(int i=0; i<len; i++){ // Printing brr (array).
        std:: cout << brr[i] << " ";
    }

    return 0;
}

答案 8 :(得分:1)

首先,因为您要切换到C ++,建议使用 vector 而不是传统的数组。 此外,要复制数组或向量,std::copy是您的最佳选择。

访问此页面以了解如何使用复制功能:http://en.cppreference.com/w/cpp/algorithm/copy

示例:

std::vector<int> source_vector;
source_vector.push_back(1);
source_vector.push_back(2);
source_vector.push_back(3);
std::vector<int> dest_vector(source_vector.size());
std::copy(source_vector.begin(), source_vector.end(), dest_vector.begin());

答案 9 :(得分:1)

我喜欢Ed S.的答案,但这仅适用于固定大小的数组,不适用于将数组定义为指针的情况。

因此,C ++解决方案将数组定义为指针:

    const int bufferSize = 10;
    char* origArray, newArray;
    std::copy(origArray, origArray + bufferSize, newArray);

注意:无需用1扣除buffersize

  

1)从第一个开始复制并复制到最后一个-1

请参阅:https://en.cppreference.com/w/cpp/algorithm/copy

答案 10 :(得分:0)

只需在您的代码中包含标准库即可。

#include<algorithm>

数组大小将表示为n

您的旧数组

int oldArray[n]={10,20,30,40,50};

声明必须在其中复制旧数组值的新数组

int newArray[n];

使用此

copy_n(oldArray,n,newArray);