簡體   English   中英

C ++迭代結構

[英]C++ iterating a struct

是否可以遍歷一個結構?

例如

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

然后運行for循環來設置或訪問foo 1-4?

我猜偽代碼看起來像

for(int i = 0; i < size; i++){
    player i = (i+1); 
 }

一個更簡單的解釋,如果沒有意義,我只是希望能夠通過每個變量而不必硬編碼player1 = 1; player2 = 2。

一種方法是將player / elements放入一個數組:

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

接着:

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

我建議使用容器而不是許多變量,例如你可以使用std::arraystd::vector 這樣,迭代就會變得微不足道,更容易復制。 但從設計的角度來看也更好:如果您決定更改播放器的數量,更改容器將更容易,而不是添加/刪除許多字段

為了回答你提出的問題,我相信你可以使用預編譯器宏包(確切的短語取決於你的編譯器)來保證用於創建結構實例的內存結構。 然后你在技術上可以增加一個指針來移動它...如果你生氣了。 這將是一種非常糟糕的方式,並且完全不能保證在不同的編譯器上工作,甚至在一周中的不同日期工作。 沒有您想要的是一種數據結構來為您完成這項工作。 他們提供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

您可以定義指向成員的指針,例如指向成員函數的指針:

  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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM