!=的另一种方式

Another way for !=

本文关键字:方式 另一种      更新时间:2023-10-16

当我执行我的代码时,我得到作为输出:

错误:控制谓词无效

我知道问题是"!="

有没有关于如何重写 for 循环中的条件以使其运行到我的数组的最后一个元素的想法

typedef pair<double,double> point;
vector<point>  smallline;
#pragma omp parallel num_threads(8)
{
#pragma omp for 
for (vector< vector<point> >::const_iterator it1 =   lines.begin(); it1!= lines.end(); it1++){
smallline = (*it1);
.
.
.
}
}

从 OpenMP 版本 5.0 开始,您还可以将!=习惯用法用于随机访问迭代器(请参阅 OpenMP 规范,第 96 页)。

早期的OpenMP版本只能并行简单for。因此,您最好的选择是:

typedef pair<double,double> point;
#pragma omp parallel num_threads(8)
{
#pragma omp for 
for (int i = 0; i < lines.size(); i++){
.
.
.
}
}

由于std::vector被定义为连续存储,并且std::vector::end将迭代器返回到容器最后一个元素之后的元素。您实际上可以使用<

#pragma omp for 
for (vector<vector<point>>::const_iterator it1 = lines.begin(); it1 < lines.end(); it1++) {

当然,这不一定适用于其他容器。但是无论如何,您都必须遵守OpenMP的要求,即它必须是随机访问迭代器。

这从 OpenMP 3.0(已有 10 多年的历史)开始工作。

也就是说,有关其余代码的少量信息令人担忧。你不能在循环中做这样的smallline = (*it1);! 默认情况下,smalline共享的,因为它是在parallel 构造之外声明的。将此变量移动到parallel构造内以避免这种情况。小心这样的竞争条件。