C 迭代结构
C++ iterating a struct
是否可以通过结构进行迭代?
例如
struct team{
int player1;
int player2;
int player3;
int player4;
...
int player99;
int size = 99;
}
然后运行循环以设置或访问foo 1-4?
我猜伪代码看起来像
for(int i = 0; i < size; i++){
player i = (i+1);
}
一个更简单的解释,如果这没有道理,我只想能够浏览每个变量而无需硬码player1 = 1;player2 = 2。
一种方法是将播放器/元素放入数组中:
struct Team {
static int const size = 99;
int players[size];
};
,然后:
for(int i = 0; i < size; ++i)
int player = players[i];
在您询问时回答您的问题,我相信您可以使用前编译器宏封装(确切的短语取决于编译器)来保证内存的结构用于创建结构的实例。然后,从技术上讲,您可以将指针升级以通过它来移动...如果您疯了。那将是一种非常糟糕的方法,完全不能保证在不同的编译器甚至一周中的不同日子上工作。没有您想要的是一个数据结构,可以为您完成这项工作;他们提供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
我建议使用容器代替许多变量,例如,您可以使用std::array
或std::vector
。这样,迭代将是微不足道的,更容易制作副本。但从设计的角度来看,它也更好:如果您决定更改玩家数量,更改容器而不是添加/删除许多字段
您可以将指针定义为成员,例如指向成员函数的指针:
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
}
- C++结构编译器错误询问向量的迭代器
- 如何使用迭代器指向结构体c++的向量
- 在VS 2017中,朋友通过具有私有析构函数的结构的unique_ptr向量进行迭代失败
- 迭代结构中包含的向量
- 为结构的向量创建C 矢量迭代器
- 是否有一个很好的方法可以在C 11中打印出像JSON一样的Trie结构(仅迭代解决方案)的扁平命名空间
- 有没有办法迭代不完整的结构
- 用于隐藏结构细节的迭代器适配器
- 在 stl 中迭代结构类型的队列
- 无法迭代结构"string"的哈希映射:[列表] C++
- Boost Intervocess:通过迭代通过从结构引用对象的映射进行迭代时
- 如何从数据结构的向量中收集迭代器
- 当迭代器添加到添加到列表向量的结构时,迭代器停止指向值?
- 使用POCO迭代JSON结构
- 是否值得两次通过文件进行迭代,以创建最小的数据结构
- 创建自定义迭代器结构以与CSTDIO一起使用
- 在编译时使用模板在跨结构字段中迭代
- 正在取消引用自定义结构字段的迭代器
- 使用C预处理器在结构字段上进行迭代
- 如何列出向量中存储的结构迭代次数