在一个原有的for循环中,由于使用了openmp加速,导致原来计算结果的顺序发生变化。需要重新写一个对数组进行排序的函数。
入参1:一个排序的标志数组:Qvectot<int> flag;
入参2:待排序的数组:Qvectot<double> outPutDataOne;
出参:int 如果运行成功,返回1,其余返回-1
实现过程中需要在原有的for函数中,定义一个全局变量 用来保存被乱序的flag;
/*
获得QVector数组中值为 key的那个元素的下标
*/
int getIndexOfQVectorArr(QVector<int> v,int key) {
//使用for循环
int len = v.size();
if (len > 1) {
for (int i = 0; i < len; i++) {
if (v[i] == key) {
return i;
}
}
}
else
{
return -1;
}
//使用迭代器##########
//auto first = v.begin();
//auto end = v.end();
//while (v.begin() != end)
//{
// cout << *first << " ";
// if (*first == key) {
// return first;
// }
// ++first;
//}
}
实现:
/*
* 对数组进行排序,排序规则为flag数组中的值,(也就是说flag的序号是按照从0-你排列的,而flag的值则是乱序的)
* 我们通过按顺序读取flag中的值,获得第一个元素对应的下标,再以这个下边去整个arrData数组中遍历,
找到arrData中下标为第一个flag的值的那个元素的内容,再将这个内容写进一个临时的数组中,(当然在处理前需要对arrData进行深拷贝一份)
这样就实现了对arrData按照flag数组的内容的序号进行排序
*/
int getSqArr(QVector<int>flag, QVector<double> &arrData) {
QVector<double> arr_temp;
//arrDataut.resize(arrData.size());
//根据下标做排序
arr_temp.append(arrData);
int m_size = flag.size();
if (m_size > 1)
{
for (int i = 0; i < flag.size(); i++)
{
int m_index = getIndexOfQVectorArr(flag, i);
if (m_index != -1)
{
arr_temp[i] = arrData[m_index];
}
}
arrData.clear();
arrData.append(arr_temp);
return 1;
}
else
{
return -1;
}
}
使用方法:
QVector<double> outPutDataOne;
QVector<int> sequenceFlag;
#pragma omp parallel for//由于openmp的存在,for内部的计算过程将不在是按顺序执行;
for (int n = 0; n < 10000; n++)
{
//...
sequenceFlag.push_back(n);
outPutDataOne.push_back(/*TODO:计算结果*/);
//...
}
int x=getSqArr(sequenceFlag, outPutDataOne);//如果x=1;不是重新排序成功;