我有一个结构,它定义了一个结构数组,每个结构包含几个数组。这些内部数组定义了我的数据集'。
在许多地方,我希望迭代所有数据集。为了避免3个嵌套循环,我遍历数据集的总数,并有几个if语句来跟踪我需要访问的数组。它看起来像这样:
int datasetCount = 0;
int defendedDatasetCount = 0;
int i;
Dataset *ds;
for (i = 0 ; i < totalDatasets ; i++)
{
// If we have passed the number of datasets in this group, move to the next group
if (datasetCount == (dg->nDatasets + dg->nDefDatasets))
{
dg++;
datasetCount = 0;
defendedDatasetCount = 0;
}
// If we have gone through all the (undefended) datasets, read from thte defended datasets
if (datasetCount >= dg->nDatasets)
{
ds = &(dg->defDatasets[defendedDatasetCount]);
defendedDatasetCount++;
}
else
{
ds = &(dg->datasets[datasetCount]);
}
其中dg
是指向结构的指针,结构只是一个结构数组和一个size
计数器。
我发现自己重复这个样板代码,用于在一些执行不同操作的函数中迭代数据集。
我努力想出这样的事情:
while (give_me_next_dataset(dg) == TRUE)
{
...
}
有可能吗?
答案 0 :(得分:2)
这是可能的,但提议的API并不是很好。您将不得不在某处放置迭代状态,并且您不会为此留下任何空间。
我会建议像:
struct DgIter {
struct Dg *dg;
size_t index;
size_t dataSet;
};
然后你可以拥有以下功能:
struct DgIter iter_start(struct Dg *dg)
{
const struct DgIter iter = { dg, 0, 0 };
return iter;
}
void * iter_next_dataset(struct DgIter *iter)
{
// check if there is a current dataset, else return NULL
// update fields in iter as necessary
}