[英]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::array
或std::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 :: vector或std :: deque或std :: 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.