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 版开始支持随机访问迭代器的并行循环。
我有一个基于范围的 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 版开始支持随机访问迭代器的并行循环。