7

C++ では、2 つの配列があるとします。

a[5] = {1,2,3,4,5};
b[5] = {5,4,3,2,1};

たとえば、a を b に等しく設定したい場合、ループを使用せずにどのようにそれを達成できるでしょうか?

私の考えでは、再帰を使用することですが、その方法が正確にはわかりません。

編集:申し訳ありませんが、標準ライブラリ関数を使用したくないことを明確にする必要がありました(一部の人が言及したmemcpyを含む)

4

5 に答える 5

17
int a[5] = {1,2,3,4,5};
int b[5] = {5,4,3,2,1};

memcpy(a, b, sizeof(a));
于 2012-10-24T17:14:47.840 に答える
11

標準ライブラリのコピー アルゴリズムを使用できます。

std::copy(std::begin(b), std::end(b), std::begin(a));

std::beginおよびstd::endC++ 標準ライブラリの新機能ですが、まだサポートされていないコンパイラで簡単に実装できます。

template <typename T, std::size_t N>
T* begin(T(&a)[N]) {
    return &a[0];
}
template <typename T, std::size_t N>
T* end(T(&a)[N]) {
    return begin(a) + N;
}

std::arrayまたは、 (または古いコンパイラの場合は Boost の同等のもの)と代入演算子を使用できます。

std::array<int, 5> a = {1,2,3,4,5};
std::array<int, 5> b = {5,4,3,2,1};
a = b;
于 2012-10-24T17:13:39.700 に答える
7

再帰の場合:

void copy(int *a, int *b, int b_size) {
     if(b_size == 0) return;    
     *a = *b;
     copy(++a, ++b, b_size-1);
}

再帰の必要性はわかりませんが、memcpy()代わりに使用する方が良いです。

于 2012-10-24T17:14:57.537 に答える
6

使用できますmemcpy()

memcpy(a, b, sizeof(a));
于 2012-10-24T17:13:37.580 に答える
4

memcpy動作しますが、memmoveメモリの場所が重複している場合は簡単に爆発しないものも使用できます(例ではそうではありませんが、たとえば「クローン」関数のロジックが発生する可能性があります)。

memmove( a, b, sizeof(a) );

もちろん、ソースと宛先が重複していないことが確実な場合memcpyは問題ありません。

于 2012-10-24T17:25:17.537 に答える