C ++如何将基于循环的范围重写为正常范围?

时间:2015-03-23 23:32:02

标签: c++ openmp

我有一个像这样的循环范围:

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循环的范围的方法。有没有人有任何想法?

提前致谢!

3 个答案:

答案 0 :(得分:5)

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

这会产生一个副本,看起来不是你想要的。我想你的意思是:

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

答案 1 :(得分:1)

如果population提供随机访问迭代器 - 并且它可能会这样做,假设您使用*(population.begin() + i) - 那么您可以像这样重写循环:

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

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

答案 2 :(得分:0)

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

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

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

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

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

至于您的特定代码无效的原因,请使用auto& individual