2012-11-01 94 views
2

是否有可能遍歷結構?C++迭代結構

例如

struct team{ 
    int player1; 
    int player2; 
    int player3; 
    int player4; 
    ... 
    int player99; 
    int size = 99; 
} 

然後運行一個for循環來設置或訪問FOO 1-4?

我猜僞代碼看起來像

如果這沒有道理的,我只是希望能夠去通過每一個變量,而無需進行硬編碼PLAYER1 = 1一個更簡單的解釋; player2 = 2。

+9

爲什麼你不使用數組/矢量,而不是結構的原因嗎? –

+0

你可以在一定程度上作弊。在這種情況下,使用完全由相同大小的項組成的結構,可以獲取指向結構實例的指針並將其視爲數組。如果結構更加異構,那將無法工作。如果它是同質的,就像這樣,爲什麼不使用矢量或數組? – Rook

+0

嗯,我有很多變量,這些變量彼此沒有關係,會被硬編碼到一個結構體中。我只是想通過遍歷它們來設置另一組數據到存在於我的結構中的變量 – sean

回答

1

我會建議使用容器來代替許多變量,例如,您可以使用std::arraystd::vector。這樣迭代就會很簡單,複製起來更容易。但從設計角度來看,這樣做更好:如果您決定更改播放器的數量,則更容易更換容器,而不是添加/移除很多字段。

5

一種方法是將播放器/元素放入數組:

struct Team { 
    static int const size = 99; 
    int players[size]; 
}; 

然後:

for(int i = 0; i < size; ++i) 
    int player = players[i]; 
1

要回答你的問題,你問過它,我相信你可以使用預編譯的宏包(確切的詞組取決於你編譯器)來保證用於創建實例o的內存結構你的結構。然後你在技術上可以增加一個指針來穿過它......如果你生氣了。這將是一個非常糟糕的做法,並且完全沒有保證可以在不同的編譯器上工作,甚至一週中的不同日子。沒有你想要的是一個數據結構來爲你做這份工作;他們有100%的現金返還保證!

最基本的結構做,這是一個固定大小的數組,例如:

struct team 
{ 
    int players[99]; //an array 
    int manager; 
    int coach; 
    string teamName; 
    //etc etc 
} 

然後訪問你的球員

team myTeam; 
for(int i(0); i < 99; ++i) 
{ 
    myTeam.players[i]; //do whatever 
} 

數組的限制是,你不能改變它的大小一旦創建。 所以如果你打算

myTeam.players[99]; //accessing invalid memory - the array values are 0 - 98 

更先進的

如果你需要一個數據結構,它的創建後,可以改變大小,例如,你可能要多幾個球員在某些時候添加到您的團隊在將來。然後你可以使用動態數據結構,如std::vectorstd::dequestd::list

+1

'//拋出異常 - 數組值爲0 - 98'。什麼。這不是Java。當你將一個數組從界限中取出時,不會引發異常。這是UB。 –

+0

@Cicada *恥辱面對*我是雙語好奇,不要判斷我! :((固定) – Ian

0

可以定義指針成員一樣,成員函數指針:

typedef int team::*member_t; 

你可以有指針數組所有成員:

static member_t member[size]; 

用這種方法定義的成員函數遍歷所有成員很簡單:

template <class F> 
    void for_each(F f) 
    { 
    for (int i = 0; i < size; ++i) 
     f(this->*member[i]); 
    } 

並且使用預處理器宏 - 您可以在一個位置定義所有成員,在成員指針的其他定義中 - 所以您不會在更改順序時發生任何錯誤。查看全部代碼:

struct team { 
#define TEAM_MEMBERS(prefix,suffix) \ 
    prefix player1 suffix, \ 
    prefix player2 suffix, \ 
    prefix player3 suffix 

    int TEAM_MEMBERS(,); 
    static const int size = 3; 
    typedef int team::*member_t; 
    static member_t member[size]; 
    template <class F> 
    void for_each(F f) 
    { 
    for (int i = 0; i < size; ++i) 
     f(this->*member[i]); 
    } 
}; 
team::member_t team::member[team::size] = { 
    TEAM_MEMBERS(&team::,) 
}; 

及一些測試:

#include <iostream> 

int main() { 
    team t = { 0 }; 
    t.for_each([](int m) { std::cout << m << "\n"; }); // prints 0,0,0 
    int n = 0; 
    t.for_each([&n](int& m) { m = n++; }); 
    t.for_each([](int m) { std::cout << m << "\n"; }); // prints 0,1,2 
    t.player2 = 7; 
    t.for_each([](int m) { std::cout << m << "\n"; }); // prints 0,7,2 
}