C++ 从函数返回向量并更新向量的对象

C++ 从函数返回向量并更新向量的对象,c++,vector,C++,Vector,我有3个播放器对象,作为函数中的引用参数传递。 该函数执行以下操作: 创建3个对象的向量,并根据它们的分数数据成员对它们进行排序。 然后检查第一、第二或第三列,并返回一个调整大小的向量。 在main函数中,我可以在遍历向量时打印获胜者和她的奖励,但它似乎不会更新实际对象。如何更新对象 这就是我到目前为止所做的: int enterBet(int balance, int maxBet); vector <Player> chkWinner(Player &a, Player

我有3个播放器对象,作为函数中的引用参数传递。 该函数执行以下操作:

创建3个对象的向量,并根据它们的分数数据成员对它们进行排序。 然后检查第一、第二或第三列,并返回一个调整大小的向量。 在main函数中,我可以在遍历向量时打印获胜者和她的奖励,但它似乎不会更新实际对象。如何更新对象

这就是我到目前为止所做的:

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;