memcpy を使用して配列の一部をコピーすることは可能ですか?
たとえば、10 個の整数の配列があるとします。新しい配列を作成して、最後の 5 つの整数をコピーできますか?
c/c++ で使用できる他のメモリ/配列のコピー/操作ツールはありますか?
memcpy を使用して配列の一部をコピーすることは可能ですか?
いいえ、一般的にはできません。配列内の要素の型が自明なレイアウトの場合にのみ、これを行うことができます。
たとえば、10 個の整数の配列があるとします。新しい配列を作成して、最後の 5 つの整数をコピーできますか?
int
s は自明な型であるため、その特定のケースでは機能します。
int source[10] = { ::: };
int target[5];
std::memcpy( target, source + 5, 5 * sizeof(int) );
c/c++ で使用できる他のメモリ/配列のコピー/操作ツールはありますか?
確かに、 C++ 標準ライブラリのアルゴリズム セット全体が配列で機能します。配列内の最初の要素と最後の 1 つ前の要素へのポインターをbegin/end
反復子として使用します。または、 C++11を使用している場合は、std::begin|end( array )
.
std::copy( source + 5, source + 10, target + 0 );
また
std::copy( std::begin(source) + 5, std::end(source), std::begin(target) );
タイプがtrivialかどうかを確認するために使用できるメタ関数と、そのような概念の定義を次に示します: http://en.cppreference.com/w/cpp/types/is_trivial
memmove()
この目的のために役立ちます。
編集:memcpy()
問題なく動作します。とにかく、おそらくもっと合理化されます。
この例では、コードは次のようになります。
int array1[10] = {0,1,2,3,4,5,6,7,8,9};
int array2[5] = {0,0,0,0,0};
memmove(array2, array1 + 5 * sizeof(int), 5 * sizeof(int));
int
これにより、array1、位置5からarray2、位置0に5ロットがコピーされます。