3

是否可以遍历结构?

例如

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; 玩家2 = 2。

4

4 回答 4

5

一种方法是将播放器/元素放入数组中:

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

接着:

for(int i = 0; i < size; ++i)
    int player = players[i];
于 2012-11-01T17:00:56.983 回答
2

要按照您的要求回答您的问题,我相信您可以使用预编译器宏包(确切的短语取决于您的编译器)来保证用于创建结构实例的内存结构。然后从技术上讲,您可以增加一个指针以在其中移动……如果您生气的话。那将是一种非常糟糕的做法,并且根本不能保证在不同的编译器甚至一周中的不同日子都能工作。不,您想要的是为您完成工作的数据结构;他们提供 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

于 2012-11-01T17:04:15.500 回答
1

您可以定义指向成员的指针,例如指向成员函数的指针:

  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
}
于 2012-11-01T17:43:59.433 回答
1

我建议使用容器而不是许多变量,例如您可以使用std::arrayor std::vector。这样,迭代将变得微不足道,制作副本更容易。但从设计的角度来看它也更好:如果您决定更改玩家的数量,更改容器会比添加/删除许多字段更容易

于 2012-11-01T16:59:51.330 回答