8
struct sample {
    int x;
    int y;
    int arr[10];
};

int arr2[10] = {0, 1, 2, 4, 3, 2, 2, 1, 5, 5};

int a = 19; 
int b = 22;
struct sample* samp = new sample;
samp->x = a;
samp->y = b;
samp->arr = ??

上記の例では、構造arr[10]内の配列をarr2[10]の要素で初期化する必要があります。

C ++でそれを行う方法??

4

4 に答える 4

3

C ++でそれを行う方法??

最も簡単な解決策はstd::copy、他の人が言ったように使用することです。C++ では使用しないでください。POD の場合も同様ですが、非 POD にも適用され、正しいことを実行するだけです。ある日、配列の型が変更された場合、そのようなコピーを行ったすべての場所に再度アクセスして、. (そして、場所の 1 つ見逃して、バグを見つけるのに苦労することになります)。C++ で使用してもメリットがないため、最初から使用してください。memcpystd::copymemcpymemcpystd::copy

より良い解決策は、C++ データ構造を使用することです。この場合は、std::array

#include <array>
struct sample {
      int x;
      int y;
      std::array<int, 10> arr; //C++ array instead of plain C array
    };

int main()
{
    std::array<int, 10> arr2 = {0, 1, 2, 4, 3, 2, 2, 1, 5, 5};

    int a = 19; 
    int b = 22;

    // 1: no need to say "struct sample*" since C++98
    // 2: prefer to use smart pointers..
    //sample* samp = new sample; 
    std::unique_ptr<sample> samp(new sample());
    samp->x = a;
    samp->y = b;
    samp->arr = arr2; //it's as easy as it should be!

    // 3: ... so ypu can't forget to delete!
    //delete samp;
}

編集: ここでは unique_ptr を使用しましたが、この小さな例ではヒープ割り当てをまったく使用する必要はありません。Grijesh の初期化も行うには:

int main()
{
    std::array<int, 10> arr2 = {0, 1, 2, 4, 3, 2, 2, 1, 5, 5};

    int a = 19; 
    int b = 22;

    sample samp = {a, b, arr2}; //done!
}

割り当て、クリーンアップ、要素ごとの割り当ては必要ありません。

于 2013-03-05T09:49:41.950 に答える
2

memcpy を使用できます。

memcpy(sample->arr,arr2,sizeof(int) * 10)

ただし、両方に std::vector を使用することをお勧めします。

于 2013-03-05T09:27:45.433 に答える
1

forループを使用して配列をコピーし、

for(int i=0; i<10; i++) {
    samp->arr[i]=arr2[i];
}
于 2013-03-05T09:34:25.640 に答える
0

通常、これにはstd::copy( <algorithm>) を使用します。

std::copy(std::begin(arr2), std::end(arr2), std::begin(samp->arr));

std::begin()and std::end()( <iterator>) には C++11 のサポートが必要であることに注意してください。コンパイラが C++11 をサポートしていない場合は、この関数を自分で簡単に提供したり、ポインター演算を使用したりできます。

std::copy(arr2, arr2 + 10, samp->arr);

std::vector悲しいことに、動的配列またはstd::array(c++11) 固定サイズ配列に使用するようにしてください。

于 2013-03-05T09:39:38.970 に答える