列挙型を使用して 2 次元配列の 1 次元を参照したい。ただし、各列挙値が表す構成は重複する場合があり (パターン化された方法ではありません)、配列内のデータが同じになる場合があります。したがって、以下の図のように、いくつかの要素が同じデータ配列を指すようにしたいと考えています。
C++ で宣言時にこれを行う方法はありますか?
はい、ポインタの配列を使用してそのような配列を作成できます。通常の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
上記と同じトリックを使用して、共有コレクション要素を確立できます。
独自のコンテナタイプを定義し、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 ++でのプログラミングに使用されていません。)
必要なのはただstd::map<your_enum_t, data_t*>
あなたのニーズに合わせてマッピングを感じるべきです