3

列挙型を使用して 2 次元配列の 1 次元を参照したい。ただし、各列挙値が表す構成は重複する場合があり (パターン化された方法ではありません)、配列内のデータが同じになる場合があります。したがって、以下の図のように、いくつかの要素が同じデータ配列を指すようにしたいと考えています。

異常なアレイ構成

C++ で宣言時にこれを行う方法はありますか?

4

3 に答える 3

5

はい、ポインタの配列を使用してそのような配列を作成できます。通常の2D配列であるかのように、その配列内の要素を参照できます。次に例を示します。

enum MyEnum {
    enumFirst = 0
,   enumSecond = 1
,   enumSecondShared = 2
,   enumThird = 3
};

static int enumFirstData[] = {1, 2, 3};
static int enumSecondData[] = {4, 3, 2};
static int enumThirdData[] = {9, 7, 8};

int *enumData[] = {
    enumFirstData
,   enumSecondData
,   enumSecondData // <== Shared
,   enumSecondData
};

これで、この配列の要素を次のように参照できます。

for (int i = 0 ; i != 3 ; i++) {
    cout << enumData[enumSecondShared][i] << endl;
}

C ++を使用しているため、コレクションを作成するには、std::vectorまたはを使用することをお勧めします。std::array上記と同じトリックを使用して、共有コレクション要素を確立できます。

于 2012-12-18T11:29:06.793 に答える
1

独自のコンテナタイプを定義し、switch/caseを使用して列挙型から参照にマップできます。このようにして、宣言時にこれらの列挙型をマップし、任意の列挙型値を使用でき、ポインターの配列にインデックスを付けるよりもタイプセーフです。

それはどういうわけかこのように見えます(テストされていません)、これはstd::mapクラスを専門としています:

template<class V>
class map<myenum,V>{
  V r1,r2,r3;
public:
  inline map(){}
  inline r1& operator[](myenum e){
    switch(e)
    {
    case E1: return r1;
    case E2:
    case E3: return r2;
    case E4:
    case E5: return r3;
    }
  }
}

map<myenum,vector<int>> example;

(高品質のstd-templateスタイル定義を記述していないことをお詫びします。私は、C ++でのプログラミングに使用されていません。)

于 2012-12-18T11:38:32.257 に答える
0

必要なのはただstd::map<your_enum_t, data_t*> あなたのニーズに合わせてマッピングを感じるべきです

于 2012-12-18T12:08:56.363 に答える