。 。 。 。 .. 。 。 。 .. 。 。 。 。 。 。 。 .. 。 。
答案 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