我有一个标识符< =>结构对的静态映射,每个结构应包含一些数组。一切都在编译时就知道了。也就是说,我想在这里有类似的东西:
ID1 => name: someString
flagCount: 3
flags: [1, 5, 10]
静态创建(如果可能)。当然,声明如下:
struct Info
{
const char* name;
int flagCount;
int flags[];
};
是理想的,只要我能像......一样初始化它。
Info infos [] = { ... };
这是不可能的,因为数组长度不一(除了我遗漏的东西)。或者,我虽然关于(ab)使用boost::assign
,但我想知道是否有推荐的解决方案。我很好,如果我只能将信息结构存储到一个数组中,并存储在其他地方。
编辑:关于当前解决方案的说明。目前,我有:
struct Info
{
Info (const std::vector<int>& flags) : flags {}
std::vector<int> flags;
};
我使用:
const std::map<ID, Info> map = boost::assign::map_list_of
("ID1", Info (boost::assign::list_of (1)(2)(3));
哪个有效,我只是好奇是否有更简单的解决方案(基于模板?)。
答案 0 :(得分:1)
数组中的元素必须彼此相同,否则您无法使用infos[i]
来访问它们 - 编译器必须逐步执行数组并查看每个元素的大小到i
找到下一个开始的地方。您可以为每个元素连续分配足够的内存,然后创建一个指向元素的指针数组(指针是固定大小)。如果您只需要映射而不索引信息,那么您的地图将成为指针的标识符。
或者,正如您在编译时知道的大小,如果只有几个标志,请使Info::flags
数组足够大以获得最大标志,或使其成为指向标志数组的指针,以便Info是一个固定大小的结构。
答案 1 :(得分:1)
使用指向可变长度数组的指针:
struct Info
{
const char* name;
int flagCount;
int *flags;
};
或大小足以容纳所有标志的固定大小数组:
struct Info
{
const char* name;
int flagCount;
int flags[MAX_FLAGS];
};
这两种解决方案都会浪费一些记忆;但对于解决方案1,它只是每个结构一个指针;请注意,您已经在名称字段中隐式使用此解决方案。
答案 2 :(得分:1)
使用矢量几乎可以肯定是最好的解决方案。 oefe为您提供了一个解决方案,其中您在Info中自己包含了一些间接,另一个选项是间接地在地图中,即map<ID, Info*>
(或者因为您正在使用boost map<ID, shared_ptr<Info> >
)并定义Info之类的。其实不要这样做。使用矢量。这是最好的解决方案。
struct Info {
const char *name;
int flagCount;
int flags[1]; // this is cheating...
};
Info* make_info(int count) {
char *buf = new char[sizeof(Info) + (sizeof(int) * (count - 1))];
Info *rv = static_cast<Info*>(static_cast<void*>(buf));
rv->flagCount = count;
}