C ++如何将基于范围的for循环重写为普通循环?

C++ how to rewrite a range based for loop to a normal one?

我有一个基于范围的 for 循环,如下所示:

for (auto& individual : population){
    individual.metadata.distance = distance(individual.tour);
}

现在我必须将其重写为普通的 for 循环,以便使用 OpenMP 并行化我的程序,我有以下内容:

int length = population.size();
#pragma omp parallel for
for (int i = 0; i < length; i++){
    auto individual =* (population.begin() + i);
    individual.metadata.distance = distance(individual.tour);
}

但是,输出变得不正确,所以我想知道这是否是重写基于范围的 for 循环的方法。有人有什么想法吗?

提前致谢!

取决于您的需要,如果您正在寻找每个 population 部分,那么这将是等效的:

for (Individual::iterator individual = population.begin(); individual != population.end(); individual++) {

这应该与auto for 循环完全相同。如果你需要计数(如 i),你可以这样处理:

int counter = 0;
for (auto& individual : population){
    ...
    counter++;

这种方法的优点是仍然使用迭代器,这是循环遍历集合的一种安全的好方法。但是您仍然可以出于任何原因检查计数。

至于为什么您的特定代码不起作用,请使用 auto& individual

auto individual =* (population.begin() + i);

这制作了一份副本,但似乎不是您想要的。我想你的意思是:

auto& individual =* (population.begin() + i);

如果 population 提供了一个随机访问迭代器——考虑到你使用的是 *(population.begin() + i),它可能会提供——那么你可以像这样重写你的循环:

#pragma omp parallel
for (sometype::iterator individual = population.begin();
     individual < population.end();
     individual++)
{
    individual->metadata.distance = distance(individual->tour);
}

OpenMP 从 3.0 版开始支持随机访问迭代器的并行循环。