并行工作但不是期望的效果

时间:2014-10-13 18:25:43

标签: c++ arrays

。 。 。 。 .. 。 。 。 .. 。 。 。 。 。 。 。 .. 。 。

1 个答案:

答案 0 :(得分:0)

问题:

当您voting()时,使用voteTotal索引将分数输入countryInd

voteTotal[countryInd[i]] = voteTotal[countryInd[i]] + score;  // in voting()

因此,您希望国家/地区名称及其相关得分ID的顺序都使用countryInd[]中定义的访问顺序。

// score of countries.at(countryInd[i]) corresponds to valueTotal[countryInd[i]]

当您BubbleSort()时,您交换了countryInd[]voteTotal[]中的元素。这是你的问题的原因,因为国家名称的正确访问顺序仍然是countryInd [i],但它现在是我的得分:

//score of countries.at(countryInd[i]) corresponds now to valueTotal[i]

您已经知道这一点,因为这正是您在printRankedTable()

中使用的逻辑

不幸的是,当您进行第二次投票运行时,您再次假设两个表都使用countryInd[]中定义的相同访问序列,这是一个不再有效的假设。您最终将一个国家/地区的投票添加到另一个国家/地区。

解决方案

更改BubbleSort() if子句,如下所示:

if (arr[countryInd[i]] < arr[countryInd[i + 1]]) // indirect access through countryInd
        {
            //tmp = arr[i];           delete => no longuer needed
            //arr[i] = arr[i + 1];    delete => no longuer needed
            //arr[i + 1] = tmp;       delete => no longuer needed
            tmpC = countryInd[i];
            countryInd[i] = countryInd[i + 1];
            countryInd[i + 1] = tmpC;
            swapped = true;
        }

同时将printRankedTable()输出指令更新为:

 cout << countries.at(countryInd[i]) << "\t" << voteTotal[countryInd[i]] << endl;  // only indirect access via countryInd