1

私の現在のプロジェクトでは、他のいくつかの値に基づいて配列を埋める必要があります。私は近道があることを知っています:

int arr[4][4] = { {0,0,0,0} , {0,0,0,0} , {0,0,0,0} , {0,0,0,0} };

しかし、この場合、宣言後に配列を埋める必要があります。現在、コードは次のようにフォーマットされています。

int arr[4][4];
if(someothervariable == 1){
    arr = { {1,1,1,1},
            {1,2,3,4},
            {2,,3,4,5},
            {3,4,5,6} };
}

ただし、コンパイルされません。私の場合、前述のショートカットを利用する方法はありますか?そうでない場合、利用可能な最良の修正は何ですか?各要素を明示的に割り当てずに設定する方法を教えてください。すなわち:arr [0] [0]=..。

4

7 に答える 7

2

std :: copy()を使用するのはどうですか?

int arr[4][4];
if(someothervariable == 1){
        const static int a2[4][4] = { {1,1,1,1},
                                      {1,2,3,4},
                                      {2,3,4,5},
                                      {3,4,5,6} };
        std::copy(&a2[0][0], &a2[0][0]+16, &arr[0][0]);
}
于 2010-06-09T22:31:38.023 に答える
1

いいえ、アレイ初期化構文はアレイ初期化用です。ただし、すべての値が同じバイトの場合はmemsetを使用できます。

boost.assignライブラリは、コレクションを変更/入力するための興味深い構文を追加しますが、AFAIKはCスタイルの配列をサポートしていません(C ++およびBoostコンテナのみ)。

于 2010-06-09T22:26:11.233 に答える
1

C ++言語の現在のバージョンでは、それを行う唯一の方法は、元のバージョンからコピーすることです。

int arr[4][4];

if (someothervariable == 1)
{
  const int SOURCE[4][4] = // make it `static` if you prefer
  { 
    {1, 1, 1, 1},
    {1, 2, 3, 4},
    {2, 3, 4, 5},
    {3, 4, 5, 6} 
  };

  assert(sizeof arr == sizeof SOURCE); // static assert is more appropriate
  memcpy(&arr, &SOURCE, sizeof arr);
}

ソースの「定数」はstatic、コンパイラーがそれ自体を最適化するのに十分なほど賢くない場合、再初期化を回避するために宣言することができます。

言語の将来のバージョンでは、Cの複合リテラルに類似した機能が計画されており、これにより、即時初期化(基本的には元の投稿で実行しようとしたこと)がサポートされます。

于 2010-06-09T22:29:26.540 に答える
1

配列を単一の値で埋めたい場合:

#include<algorithm>
#include<vector>

// ...
std::vector<int> arr;
std::fill(arr.begin(), arr.end(), VALUE);  // VALUE is an integer

各要素の値を計算する場合:

struct get_value {
    int operator()() const { /* calculate and return value ... */ }
};

std::generate(arr.begin(), arr.end(), get_value());
于 2010-06-09T22:30:45.017 に答える
0

すべてを同じ値 (ゼロなど) に設定している場合、問題を解決できる可能性があります ...

memset (arr, 0, sizeof (arr));

これには危険が伴うことに注意してください。あなたはあなたのタイプのサイズとそのすべてのジャズを知る必要があります.

ただし、それだけでは十分ではないようです。配列に異なる値を入力したい場合、これを行う方法は 2 つしか考えられません。

方法 #1。(お尻が痛いかも)

arr[0][0] = 1;
...
arr[0][3] = 1;
arr[1][0] = 1;
...
arr[1][3] = 4;
arr[2][0] = 2;
...
arr[2][3] = 5;
arr[3][0] = 3;
...
arr[3][3] = 6;

方法 #2。一連の配列を事前に定義し、ポインターを使用してそれらを切り替えます。

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

int *arr[4];

これで、すべてを設定する代わりに、設定する *arr[] の 4 つの値しかありません。もちろん、これは、配列が事前に定義された定数で満たされている場合にのみ機能します。

お役に立てれば。

于 2010-06-09T22:34:13.993 に答える
0

この解決策が気に入るかどうかはわかりませんが、C/C++ では、配列を構造体でラップすると、構造体名を使用して配列を取得する必要があるというわずかなコストで、割り当てが便利になります。

typedef struct {
    int data[4][4];
} info_t;

info_t arr;

if (someothervariable == 1){
    static const info_t newdata = {{  // since this is static const, there generally
                                      // won't be a copy - that data will be 'baked' 
                                      // into the binary image (or at worst a
                                      // single copy will occur)
        {1,1,1,1},
        {1,2,3,4},
        {2,3,4,5},
        {3,4,5,6} 
    }};
    arr = newdata;  // easy to assign new data to the array
}

int somethingelse = arr.data[1][2]; // a tiny bit less convenient to get 
                                    //    to the array data
于 2010-06-09T22:54:58.763 に答える
-2
int arr[4][4];
if (someothervariable == 1) {
     int tmp[4][4] = { {1, 1, 1, 1}, {1, 2, 3, 4}, {2, 3, 4, 5}, {3, 4, 5, 6} };
     arr = tmp;
}
于 2010-06-09T22:28:21.073 に答える