3

我想使用枚举来引用二维数组的第一维。但是,每个枚举值表示的配置有时会重叠(不是以任何模式化的方式),这意味着数组中的数据有时会相同。因此,我想让一些元素指向相同的数据数组,如下图所示。

不寻常的阵列配置

在 C++ 的声明时有什么方法可以做到这一点?

4

3 回答 3

5

是的,您可以使用指针数组构建这样的数组;您将能够像引用常规二维数组一样引用该数组中的元素。这是一个例子:

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::vectororstd::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;

(很抱歉没有编写高质量的标准模板样式定义,我不再习惯用 C++ 编程了。)

于 2012-12-18T11:38:32.257 回答
0

您所需要的只是std::map<your_enum_t, data_t*> 您应该根据自己的需要感受映射

于 2012-12-18T12:08:56.363 回答