私は C/C++ を学んでいる Java プログラマーです。したがって、Java には System.arraycopy(); のような関数があることを知っています。配列をコピーします。CまたはC++に配列をコピーする関数があるかどうか疑問に思っていました。forループ、ポインタなどを使用して配列をコピーする実装しか見つけることができませんでした。配列をコピーするために使用できる関数はありますか?
12 に答える
あなたが 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++11 以降、次のコマンドで配列を直接コピーできますstd::array
。
std::array<int,4> A = {10,20,30,40};
std::array<int,4> B = A; //copy array A into array B
他の人が述べたように、C ではmemcpy
. ただし、これは生のメモリ コピーを行うことに注意してください。そのため、データ構造がそれ自体または相互へのポインタを持っている場合、コピー内のポインタは元のオブジェクトを指し続けます。
C++ ではmemcpy
、配列メンバーが POD (つまり、C でも変更せずに使用できる基本的な型) の場合にも使用できますが、一般的にmemcpy
は許可されません。他の人が述べたように、使用する関数はstd::copy
.
そうは言っても、C++ では生の配列を使用することはめったにありません。代わりに、標準コンテナーのいずれかを使用する必要があります (std::vector
は組み込み配列に最も近いものであり、Java 配列に最も近いと思います — 実際、単純な C++ 配列よりも近いですがstd::deque
、std::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;
}
memcpy
C、std::copy
C++ で使用します。
を使用できます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()
は、 が指す位置から が指すメモリ ブロックにnum
bytesの値をコピーします。コピーは、あたかも中間バッファーが使用されたかのように行われ、コピー先とコピー元がオーバーラップできます。source
destination
C では、 を使用できますmemcpy
。C++ ではヘッダーstd::copy
から使用します。<algorithm>
コードに標準ライブラリを含めるだけです。
#include<algorithm>
配列サイズは次のように示されますn
古い配列
int oldArray[n]={10,20,30,40,50};
古い配列値をコピーする必要がある新しい配列を宣言します
int newArray[n];
これを使って
copy_n(oldArray,n,newArray);
まず、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());