2009-03-01 118 views
0

我有一個標識符爲< =>結構對的靜態映射,每個結構都應該包含一些數組。一切都在編譯時已知。也就是說,我想在這裏有這樣的東西:使用不同長度的數組靜態初始化結構

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

您是否知道編譯時數組中每個Info對象的flags數組的長度? – dirkgently 2009-03-01 11:41:10

+0

是的。但是,對於不同的信息它是不同的。 – Anteru 2009-03-01 13:14:11

回答

1

數組中的元素必須是相同的大小,否則您不能使用infos[i]來訪問它們 - 編譯器必須遍歷數組,並查看每個元素的大小,最大爲i找到下一個開始的地方。您可以爲每個元素連續分配足夠的內存,然後創建一個指向元素的指針數組(指針爲固定大小)。如果你只需要映射而不是索引信息,那麼你的映射就會成爲指針的標識符。另外,正如你知道編譯時的大小,如果只有幾個標誌,使Info::flags數組足夠大的最大標誌,或使它成爲一個標誌數組的指針,以便Info是一個固定大小的結構。

1

既可以使用一個指針到可變長度數組:

struct Info 
{ 
    const char* name; 
    int flagCount; 
    int *flags; 
}; 

或固定大小的數組大到足以容納所有的標誌:

struct Info 
{ 
    const char* name; 
    int flagCount; 
    int flags[MAX_FLAGS]; 
}; 

這兩種解決方案會浪費一些存儲器;但對於解決方案1,它只是每個結構體的一個指針;請注意,您已經隱式地將該解決方案用於名稱字段。

1

像你這樣使用矢量幾乎肯定是最好的解決方案。 oefe爲您提供了一種解決方案,您可以在Info中自行添加一些間接內容,另一種選擇是在地圖上間接使用,即map<ID, Info*>(或者因爲您正在使用boost map<ID, shared_ptr<Info> >)並定義Info like。其實不要這樣做。使用矢量。這是最好的解決方案。

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