7

memcpy を使用して配列の一部をコピーすることは可能ですか?

たとえば、10 個の整数の配列があるとします。新しい配列を作成して、最後の 5 つの整数をコピーできますか?

c/c++ で使用できる他のメモリ/配列のコピー/操作ツールはありますか?

4

2 に答える 2

12

memcpy を使用して配列の一部をコピーすることは可能ですか?

いいえ、一般的にはできません。配列内の要素の型が自明なレイアウトの場合にのみ、これを行うことができます。

たとえば、10 個の整数の配列があるとします。新しい配列を作成して、最後の 5 つの整数をコピーできますか?

ints は自明な型であるため、その特定のケースでは機能します。

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

于 2013-02-07T17:32:06.097 に答える
1

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ロットがコピーされます。

于 2013-02-07T17:37:28.287 に答える