【问题标题】:Returning a vector from a function and update the objects of the vector从函数返回向量并更新向量的对象
【发布时间】:2014-10-18 14:11:33
【问题描述】:

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

  1. 创建 3 个对象的 vector,并根据它们的分数(数据成员)对它们进行冒泡排序。
  2. 然后它检查第一、第二或第三等级并返回调整大小的vector

main 函数中,当我遍历vector 时,我能够打印获胜者和她的奖励,但它似乎并没有更新实际对象。 如何更新对象?

这是我目前所拥有的:

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;
}

【问题讨论】:

  • 您返回一个包含玩家副本的向量 - 这是您的意图吗?我建议您通过vector&lt;Player&gt;&amp; 并使用新订单对其进行修改。这也允许您拥有任意数量的玩家。我建议你使用内置的排序功能。这个循环有什么意义:for (int i = 0; i &lt; 1; i++)
  • 对不起,我不明白这一点。我尝试传递向量数组的引用,但它为所有玩家的总数输出 0。我希望宣布获胜者并将奖励添加到实际玩家而不是他的副本。
  • 贴出你试过的代码。
  • 1.你为什么说vector arrayvector 就够了。 2. 你的代码没有编译。请发布可编译的代码。 3.当你重写了chkWinner函数时,请删除早期版本或至少将其注释掉。并显示修改后的main 函数。 4. 最后,你的Player 班级是什么样子的?也发布该代码。
  • gargankit,那是复制错误,我已经修改了,谢谢

标签: c++ vector


【解决方案1】:

正如每个人都指出的那样,您不应该创建一个新数组并修改您已有的数组。 STL 帮助您使用排序功能完成您想要的工作。

首先,你需要:

#include <algorithm>

那么你需要一个排序函数:

bool sorting_method(const Player &_1, const Player &_2){
    //Bigger numbers go first
    return _1.m_total > _2.m_total;
}

最后,您使用排序而不是链式循环:

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.
{

More information about std::sort()

编辑:我修改了代码以创建一个数组,其中包含指向玩家的指针而不是玩家的副本。

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;

请注意,由于该更改,您必须修改所有尝试访问数组的代码,包括排序方法。我写的这段代码已经被修改了,所以你只需要修改它的其余部分。我在创建数组时删除了resize函数并添加了(3)参数。我相信它更简单明了。玩得开心:D

【讨论】:

  • 嗨,我已经用 std:sort 重写了代码。但它仍然没有更新数组外的 player.m_total。看起来向量数组包含的玩家与实际玩家不同。
  • @Chintan 我可能首先误解了你想要的东西。你想改变对象内部的值吗?如果是这样,为什么?看起来他们每个人都是球员,你会弄乱这些价值观。我在回答中写的内容旨在仅对数组进行排序,而不更改每个成员。
  • 所以,有 3 个玩家(1 个玩家 + 2 个 AI)。每个玩家都有一个“m_balance”成员变量。所有玩家在比赛前下注,然后获胜者赢得整个底池。所以排序算法帮助我找到获胜者,然后我将底池值添加到获胜者“m_balance”中。我能够推导出获胜者,但无法将底池值添加到他们的“m_balance”变量中
  • @Chintan 我想我找到了问题所在。创建数组时,实际上是在复制玩家,而不是传递对它们的引用。之后,您修改副本,原件保持不变。我将把我的答案改成我写的新代码。
  • 非常感谢。它终于奏效了,但我仍然不确定这种语法中的“*”是做什么的。矢量 获胜者Arr(3);无论如何,谢谢大家,我学到了很多。
猜你喜欢
  • 2017-06-27
  • 1970-01-01
  • 2023-01-04
  • 1970-01-01
  • 2022-07-18
  • 1970-01-01
  • 1970-01-01
  • 2018-12-13
  • 1970-01-01
相关资源
最近更新 更多