C / C ++에서 배열을 복사하는 기능이 있습니까? 그래서 Java에는 System.arraycopy ();와 같은

저는 C / C ++를 배우는 Java 프로그래머입니다. 그래서 Java에는 System.arraycopy ();와 같은 기능이 있다는 것을 알고 있습니다. 배열을 복사합니다. 배열을 복사하는 함수가 C 또는 C ++에 있는지 궁금합니다. for 루프, 포인터 등을 사용하여 배열을 복사하는 구현 만 찾을 수있었습니다. 배열을 복사하는 데 사용할 수있는 함수가 있습니까?



답변

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 에 대한 문서입니다.


답변

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));


답변

다른 사람들이 언급했듯이 C에서는 memcpy. 그러나 이것은 원시 메모리 복사를 수행하므로 데이터 구조에 자체 또는 서로에 대한 포인터가있는 경우 복사본의 포인터는 여전히 원래 개체를 가리 킵니다.

C ++에서 당신은 또한 사용할 수있는 memcpy배열 구성원이, (당신은 또한 C에서 변경 사용할 수도 본질적 유형이다) 그러나 일반적으로, POD하면 memcpy됩니다 되지 허용합니다. 다른 사람들이 언급했듯이 사용할 기능은 std::copy.

그러나 C ++에서는 원시 배열을 거의 사용하지 않아야합니다. 대신 당신도 표준 컨테이너 중 하나를 사용해야합니다 ( std::vector있는 배열 내장, 또한 내가 자바 배열에 가까운 생각에 가장 가까운 – 가까운 일반 C보다 ++ 배열, 참 -하지만, std::deque또는 std::list어떤 경우에는 더 적합 할 수 있음) 또는 std::array내장 배열에 매우 가깝지만 다른 C ++ 유형과 같은 값 의미를 갖는 C ++ 11을 사용하는 경우 . 여기서 언급 한 모든 유형은 할당 또는 복사 구성으로 복사 할 수 있습니다. 또한 반복자 구문을 사용하여 opne에서 다른 것으로 (및 내장 배열에서도) “교차 복사”할 수 있습니다.

이것은 가능성에 대한 개요를 제공합니다 (모든 관련 헤더가 포함되었다고 가정합니다).

int main()
{
  // This works in C and C++
  int a[] = { 1, 2, 3, 4 };
  int b[4];
  memcpy(b, a, 4*sizeof(int)); // int is a POD

  // This is the preferred method to copy raw arrays in C++ and works with all types that can be copied:
  std::copy(a, a+4, b);

  // In C++11, you can also use this:
  std::copy(std::begin(a), std::end(a), std::begin(b));

  // use of vectors
  std::vector<int> va(a, a+4); // copies the content of a into the vector
  std::vector<int> vb = va;    // vb is a copy of va

  // this initialization is only valid in C++11:
  std::vector<int> vc { 5, 6, 7, 8 }; // note: no equal sign!

  // assign vc to vb (valid in all standardized versions of C++)
  vb = vc;

  //alternative assignment, works also if both container types are different
  vb.assign(vc.begin(), vc.end());

  std::vector<int> vd; // an *empty* vector

  // you also can use std::copy with vectors
  // Since vd is empty, we need a `back_inserter`, to create new elements:
  std::copy(va.begin(), va.end(), std::back_inserter(vd));

  // copy from array a to vector vd:
  // now vd already contains four elements, so this new copy doesn't need to
  // create elements, we just overwrite the existing ones.
  std::copy(a, a+4, vd.begin());

  // C++11 only: Define a `std::array`:
  std::array<int, 4> sa = { 9, 10, 11, 12 };

  // create a copy:
  std::array<int, 4> sb = sa;

  // assign the array:
  sb = sa;
}


답변

당신은을 사용할 수 있습니다 memcpy(),

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

memcpy()num가리키는 위치에서가 가리키는 source메모리 블록 으로 바이트 값을 직접 복사합니다 destination.

는 IF destinationsource중복, 당신은 사용할 수 있습니다 memmove().

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

memmove()num가리키는 위치에서가 가리키는 source메모리 블록 으로 바이트 값을 복사합니다 destination. 복사는 마치 중간 버퍼가 사용 된 것처럼 이루어 지므로 대상과 소스가 겹칠 수 있습니다.


답변

memcpyC, std::copyC ++에서 사용합니다 .


답변

나는 Ed S.의 대답을 좋아하지만 이것은 고정 크기 배열에서만 작동하며 배열이 포인터로 정의 된 경우에는 작동하지 않습니다.

따라서 배열이 포인터로 정의되는 C ++ 솔루션 :

#include<algorithm>
...
const int bufferSize = 10;
char* origArray, newArray;
std::copy(origArray, origArray + bufferSize, newArray);

참고 : buffersize1 로 공제 할 필요가 없습니다 .

  1. 처음부터 마지막까지 [first, last) 범위의 모든 요소를 ​​복사합니다.-1

참조 : https://en.cppreference.com/w/cpp/algorithm/copy


답변

C에서는 memcpy. C ++에서는 헤더 std::copy에서 사용 합니다 <algorithm>.