114

私は C/C++ を学んでいる Java プログラマーです。したがって、Java には System.arraycopy(); のような関数があることを知っています。配列をコピーします。CまたはC++に配列をコピーする関数があるかどうか疑問に思っていました。forループ、ポインタなどを使用して配列をコピーする実装しか見つけることができませんでした。配列をコピーするために使用できる関数はありますか?

4

12 に答える 12

167

あなたが 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));
于 2013-04-22T01:12:27.543 に答える
99

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に関するドキュメントがあります

于 2013-04-22T01:12:48.347 に答える
91

他の人が述べたように、C ではmemcpy. ただし、これは生のメモリ コピーを行うことに注意してください。そのため、データ構造がそれ自体または相互へのポインタを持っている場合、コピー内のポインタは元のオブジェクトを指し続けます。

C++ ではmemcpy、配列メンバーが POD (つまり、C でも変更せずに使用できる基本的な型) の場合にも使用できますが、一般的にmemcpyは許可されません。他の人が述べたように、使用する関数はstd::copy.

そうは言っても、C++ では生の配列を使用することはめったにありません。代わりに、標準コンテナーのいずれかを使用する必要があります (std::vectorは組み込み配列に最も近いものであり、Java 配列に最も近いと思います — 実際、単純な C++ 配列よりも近いですがstd::dequestd::list場合によっては、より適切な場合もあります)。または、std::array組み込み配列に非常に近い C++11 を使用する場合、値のセマンティクスは他の C++ 型と同様です。ここで言及したすべての型は、代入またはコピー構築によってコピーできます。さらに、反復子構文を使用して、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;
}
于 2013-08-18T12:39:41.583 に答える
19

memcpyC、std::copyC++ で使用します。

于 2013-04-22T01:12:34.910 に答える
18

を使用できますmemcpy()

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

memcpy()numは、 が指す場所からバイトの値を、 が指すsourceメモリ ブロックに直接コピーしますdestination

destinationとが重複する場合は、sourceを使用できますmemmove()

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

memmove()は、 が指す位置から が指すメモリ ブロックにnumbytesの値をコピーします。コピーは、あたかも中間バッファーが使用されたかのように行われ、コピー先とコピー元がオーバーラップできます。sourcedestination

于 2013-04-22T01:09:49.457 に答える
11

C では、 を使用できますmemcpy。C++ ではヘッダーstd::copyから使用します。<algorithm>

于 2013-04-22T01:12:53.580 に答える
5

コードに標準ライブラリを含めるだけです。

#include<algorithm>

配列サイズは次のように示されますn

古い配列

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

古い配列値をコピーする必要がある新しい配列を宣言します

int newArray[n];

これを使って

copy_n(oldArray,n,newArray);
于 2019-05-31T04:47:47.383 に答える
2

まず、C++ に切り替えているため、従来のarrayの代わりに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());
于 2016-12-06T23:04:27.573 に答える