C++ 从函数返回向量并更新向量的对象
我有3个播放器对象,作为函数中的引用参数传递。 该函数执行以下操作: 创建3个对象的向量,并根据它们的分数数据成员对它们进行排序。 然后检查第一、第二或第三列,并返回一个调整大小的向量。 在main函数中,我可以在遍历向量时打印获胜者和她的奖励,但它似乎不会更新实际对象。如何更新对象 这就是我到目前为止所做的:C++ 从函数返回向量并更新向量的对象,c++,vector,C++,Vector,我有3个播放器对象,作为函数中的引用参数传递。 该函数执行以下操作: 创建3个对象的向量,并根据它们的分数数据成员对它们进行排序。 然后检查第一、第二或第三列,并返回一个调整大小的向量。 在main函数中,我可以在遍历向量时打印获胜者和她的奖励,但它似乎不会更新实际对象。如何更新对象 这就是我到目前为止所做的: int enterBet(int balance, int maxBet); vector <Player> chkWinner(Player &a, Player
int enterBet(int balance, int maxBet);
vector <Player> chkWinner(Player &a, Player &b, Player &c, int pot);
bool sorting_method(Player &_1, Player &_2) {
//Bigger numbers go first
return _1.m_total > _2.m_total;
}
int main()
{
Player *player1 = new Player;
Player *player2 = new Player;
Player *player3 = new Player;
vector <Player> winnerArr;
winnerArr.resize(3);
int pot = 0;
int betAmount = 0;
int maxBet = 10;
player2->m_name = "Kelly";
player3->m_name = "Martha";
int x, y, z;
winnerArr[0] = *player1;
winnerArr[1] = *player2;
winnerArr[2] = *player3;
sort(winnerArr.begin(), winnerArr.end(), sorting_method);
cout << winnerArr[0].m_total << ", "
<< winnerArr[1].m_total << ", "
<< winnerArr[2].m_total << endl;
x = winnerArr[0].m_total;
y = winnerArr[1].m_total;
z = winnerArr[2].m_total;
if (x == y && x == z){
cout << "Divide pot by 3" << endl;
//totalArr.resize(3);
}
else if (x == y && x != z){
cout << "Divide pot by 2" << endl;
winnerArr.resize(2);
}
else{
cout << "Pay full Pot" << endl;
winnerArr.resize(1);
}
int payout;
if (winnerArr.size() == 3){
payout = ((pot * 5) / 3);
}
else if (winnerArr.size() == 2){
payout = ((pot * 5) / 2);
}
else if (winnerArr.size() == 1){
payout = (pot * 5);
for (int i = 0; i < winnerArr.size(); i++){
cout << winnerArr[i].m_name << " wins " << payout << endl;
winnerArr[i].m_balance += payout;
cout << winnerArr[i].m_balance << endl;
}
}
cout << player1->m_name << "'s total: " << player1->m_balance << endl;
cout << player2->m_name << "'s total: " << player2->m_balance << endl;
cout << player3->m_name << "'s total: " << player3->m_balance << endl;
break;
}
正如大家所指出的,您不应该创建一个新数组并修改已有的数组。STL帮助您完成排序功能所需的功能 首先,你需要:
#include <algorithm>
最后,使用排序而不是链式循环:
void chkWinner(std::vector <Player> &totalArr){
sort(totalArr.begin(), totalArr.end(), sorting_method);
// Add code here, if you need to perform something else.
//totalArr is already in the order you need it to.
{
请注意,由于该更改,您必须修改尝试访问数组的所有代码,包括排序方法。我写的这段代码已经修改过了,所以您只需要修改它的其余部分。我删除了resize函数,并在创建数组时添加了3参数。我相信它简单明了。玩得开心:D你返回了一个玩家副本的向量-这是你想要的吗?我建议你传递一个向量&并用新的顺序修改它。这也允许您拥有任意数量的玩家。我建议您使用内置的排序功能。这个循环的意义是什么:对于int i=0;i<1;对不起,我不明白这一点。我尝试传递向量数组的一个ref,但它为al-player的总数输出0。我想宣布胜利者,并将奖励添加到实际玩家而不是他的副本。发布您尝试的代码。1。你为什么说向量数组?向量就足够了。2.您的代码无法编译。请发布一个可编译的代码。3.重写CHKWINER函数后,请删除早期版本或至少对其进行注释。并给出了修改后的主函数。4.最后,你的玩家职业看起来怎么样?gargankit,这是一个复制错误,我修改了它,谢谢,我用std:sort重写了代码。但它仍然不会更新数组外的player.m_总数。看起来向量数组容纳的玩家与实际玩家不同。@Chintan我可能误解了你最初想要的。是否要更改对象内部的值?若然,原因为何?看起来他们每个人都是一个球员,你会搞乱那些价值观。我在回答中所写的是为了只对数组进行排序,而不改变每个成员。因此,有3名玩家1名玩家+2名AI。每个玩家都有一个“m_balance”成员变量。所有玩家在比赛前下注,然后获胜者赢得整个赌注。因此,排序算法帮助我找到赢家,然后我将pot值添加到赢家的“m_余额”中。我能够得出获胜者,但无法将奖金价值添加到他们的“m_余额”中variable@Chintan我想我发现了问题所在。创建阵列时,实际上是在复制玩家,而不是向他们传递引用。然后修改副本,原件保持原样。我将根据我编写的新代码更改我的答案。非常感谢。它最终成功了,但我仍然不确定这个语法中的“*”是做什么的。载体WinneRar3;无论如何,谢谢大家,我学到了很多。
void chkWinner(std::vector <Player> &totalArr){
sort(totalArr.begin(), totalArr.end(), sorting_method);
// Add code here, if you need to perform something else.
//totalArr is already in the order you need it to.
{
bool sorting_method(Player *_1, Player *_2) {
//Bigger numbers go first
return _1->m_total > _2->m_total;
}
int main()
{
Player *player1 = new Player(2, 1);
Player *player2 = new Player(5 ,2);
Player *player3 = new Player(3, 3);
vector <Player *> winnerArr(3);
int pot = 0;
int betAmount = 0;
int maxBet = 10;
int x, y, z;
winnerArr[0] = player1;
winnerArr[1] = player2;
winnerArr[2] = player3;
sort(winnerArr.begin(), winnerArr.end(), sorting_method);
cout << winnerArr[0]->m_name << ", "
<< winnerArr[1]->m_name << ", "
<< winnerArr[2]->m_name << endl;