2014-09-18 103 views
2

隨着編程變得更加複雜,並且需要對結構數據執行操作變得可見。是否有一個結構類型轉化爲其成員的陣列的轉換方法,使得:將結構轉換爲數組

int Bar[2]; 

或者更好,動態地爲::

vector<int> Bar; 

struct FooDesc Foo{ 
    int num_Foo; 
    int num_Bar; 
    int GreenFoo; 
}; 

可以由下式表示

目標是將數據結構轉換或重新表示爲可迭代的形式,而不會過度使用賦值運算符。

+0

爲什麼不在結構中保存一個數組? – juanchopanza 2014-09-18 20:23:24

+3

'int bar [2]' - 不。 'int bar [3]' - 是的。 – 2014-09-18 20:25:02

+0

@juanchopanza實際的實現承載了大量定義項目屬性的成員,並將其寫入文件。我害怕爲我的眼睛創造一堆無法讀取的數據。但我也希望能夠附加「特殊」屬性。 – 2014-09-18 20:28:47

回答

4

你可以使用無名struct s至使混合struct其中的成員都可以被視爲一個數組:但是

struct Foo { 
    union { 
    struct { 
     int x; 
     int y; 
     int z; 
    }; 
    struct { 
     int array[3]; 
    }; 
    }; 
}; 

LIVE DEMO

注意,那無名struct來自C11和不一個標準的C++功能。它作爲一個擴展支持,雖然由海灣合作委員會以及鐺。

+0

聯合創建一個指向兩個表示的單個數據位置的指針?這非常有用! – 2014-09-18 20:45:14

+0

實施工作沒有任何問題。 (VS2013)這個解決方案打開了一個'vector '任務的大門,將所有必要的數據添加到一個動態數組中。下一個任務是創建一個設計來處理我認爲可變類型的結構。 – 2014-09-18 22:40:33

2

如何:

vector <Foo> Bar; 

可以再加入你的結構的實例,然後訪問每個元素需要,可以使用類似陣列的格式。

更多信息請參見此相關的問題:

Vector of structs initialization

,在重讀你的問題了幾次,我想我錯理解您的意圖,並回答了「錯誤的問題」。你可以像上面提到的那樣創建一個你的結構體的數組,並將它索引爲一個數組,但我不認爲這很簡單,因爲每個struct元素都是一個數組的不同元素。如果你正在尋找一些結構,我的答案應該會有所幫助。如果你想讓你的結構的每個元素都是數組的一個元素,那麼40two的答案應該可以幫助你。

2

如果你的結構是POD,那麼你可以考慮使用std :: tuple而不是結構。然後,您可以使用各種模板工具來處理元組的成員。

下面是一個簡單的例子,它打印元組的元素 - 使用boost ::融合::元組代替的std ::元組,因爲它有許多可用的更多的元組操縱設施:

#include <boost/fusion/tuple.hpp> 
#include <boost/fusion/include/for_each.hpp> 
#include <iostream> 

struct Printer {  
    template<typename T> 
    void operator()(const T &t) const { 
     std::cout << t << std::endl; 
    } 
}; 

int main(int argc, const char * argv[]) 
{ 
    boost::fusion::tuple<int, int, int, int, float> t = 
      boost::fusion::make_tuple(3, 5, 1, 9, 7.6f); 

    boost::fusion::for_each(t, Printer()); 

    return 0; 
} 

你可以在結構中包含這些結構,但你想做一些測試以確保正確的對齊協議。

好處是這些操作速度非常快 - 大部分工作都是在編譯時完成的。不利的一面是你不能使用正常的控制結構,比如使用運行時索引建立索引 - 你必須建立一個抽象層,因爲正常的get<i>(tuple)訪問器要求i是一個編譯時間常量。這是否值得複雜取決於應用。

+0

我將不得不研究它的實現並取回。 – 2014-09-18 20:49:07

+0

你想對成員做什麼樣的事情? – sfjac 2014-09-18 20:54:25

+0

只需遍歷它們並寫入一個文件即可。我想我可以在輸出時只輸出標題和數據,但我也想將多個結構的數據追加到文件中 - 可以動態存儲額外的「成員」。編輯:無聊的東西:想象一下游戲角色。 – 2014-09-18 21:35:35