我想使用枚举引用2维数组的第一维。但是,每个枚举值表示的配置有时会重叠(不是以任何图案化方式),这意味着数组中的数据有时会相同。因此,我希望有一些元素指向相同的数据数组,如下图所示。
有没有办法在C ++的声明时间这样做?
答案 0 :(得分: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
是制作集合的首选方式。您可以使用与上面相同的技巧来建立共享集合元素。
答案 1 :(得分:1)
您可以定义自己的容器类型,并使用开关/案例从枚举映射到引用。这样,你可以在声明时映射这些枚举,可以使用任意枚举值,并且比索引数组索引更安全。
它会看起来像这样(未经测试),它专门研究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 ++编程了。)
答案 2 :(得分:0)
您只需要std::map<your_enum_t, data_t*>
您应该根据自己的需要进行映射