静态初始化具有不同长度的数组的结构

时间:2009-03-01 11:33:29

标签: c++

我有一个标识符< =>结构对的静态映射,每个结构应包含一些数组。一切都在编译时就知道了。也就是说,我想在这里有类似的东西:

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));

哪个有效,我只是好奇是否有更简单的解决方案(基于模板?)。

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;
 }