我有一个像这样的循环范围:
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循环的范围的方法。有没有人有任何想法?
提前致谢!
答案 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
。