【问题标题】:vector iterator + offset out of range, at the end of while loop it gives the error向量迭代器+偏移超出范围,在while循环结束时给出错误
【发布时间】:2014-03-12 01:30:43
【问题描述】:
while (deckSize > 2)
{

    one_Card = card_deck.back();
    card_deck.pop_back();

    two_Card = card_deck.back();
    card_deck.pop_back();

    three_Card = card_deck.back();
    card_deck.pop_back();


    oneCard_Name = card_name(one_Card);
    twoCard_Name = card_name(two_Card);
    threeCard_Name = card_name(three_Card);

    oneCard_Suit = card_suit(one_Card);
    twoCard_Suit = card_suit(two_Card);
    threeCard_Suit = card_suit(three_Card);

    oneCard_Rank = card_rank(one_Card);
    twoCard_Rank = card_rank(two_Card);
    threeCard_Rank = card_rank(three_Card);

    bool between1 = (oneCard_Rank < threeCard_Rank && threeCard_Rank < twoCard_Rank);
    bool between2 = (twoCard_Rank < threeCard_Rank && threeCard_Rank < oneCard_Rank);


    cout << "Here are your two cards: " << endl;
    cout << setw(10) << oneCard_Name << " of " << oneCard_Suit << setw(20) << twoCard_Name << " of " << twoCard_Suit << endl;
    cout << "Do you think the next card will lie between these? (y/n): ";
    cin >> user_input;
    cout << endl << endl;
    cout << "Here is your next card: " << endl;
    cout << setw(10) << threeCard_Name << " of " << threeCard_Suit << endl << endl << endl;
    count++;


    if(user_input == "y" || user_input == "yes" || user_input == "Yes" || user_input == "Y")
    {
        if(between1 || between2)
        {
            cout << "You win!" << endl;
            win++;
        }
        else
        {
            cout << "You lose!" << endl;
            lose++;
        }
    }
    else
    {
        if(between1 || between2)
        {
            cout << "You lose!" << endl;

            lose++;
        }
        else
        {
            cout << "You win!" << endl;

            win++;
        }
    }
}


cout << "You have played this game " << count << " times and you have won: " << win << " and lost " << lose << endl;

return 0;

}

这是洗牌和初始化牌组的两个子程序

void initDeck(vector<int> &card_deck)
{
    int i;
    for(i = 0; i <= 51; i++)
    {
        card_deck[i] = i;
    }

}


void shuffleDeck(vector<int> & card_deck)
{
    int n;

        for(n = 51; n >= 0; n--)
        {
            int i = randomize();
            int temp = card_deck[i];
            int temp2= card_deck[n];
            card_deck[n] = temp;
            card_deck[i] = temp2;

        }

}

当我运行程序之后,它允许我运行它,但是当我达到小于 while 循环中条件的数字时,它只会给我一个错误,并且不会完成程序。我之前遇到了这个错误并修复了它,所以我对错误的含义有一个基本的了解。据我所知,它正在尝试收集超过矢量长度的数字。但是这次我根本看不到我的错误。

【问题讨论】:

  • 您的initDeck 看起来非常错误。它返回一个std::vector 而不是通过引用获取一个,或者至少确保vector 有足够的大小。代码应该检查它的先决条件,或者至少断言它们。

标签: c++ vector


【解决方案1】:

deckSize 没有在任何地方设置/更新。应该是card_deck.size()

【讨论】:

  • 哦,对不起,它在我的 while 循环之前。但是如果我在deckSize = card_deck.size() 中设置它会有所不同吗?我就是这么做的。
  • 只要它在每个循环迭代之前分配并更新,就没有区别,而不仅仅是之前。
  • 天哪,非常感谢!!!!它终于起作用了,好吧,我明白你的意思了,我的程序一直循环的原因是因为当我一开始分配 sizeDeck 时它没有改变,所以循环总是正确的
【解决方案2】:

您应该使用push_backemplace 作为类型向量,如下所示:

void initDeck(vector<int> &card_deck){
int i;
for(i = 0; i <= 51; i++)
{
    card_deck.push_back(i);
}

}

看看这个link

【讨论】:

    【解决方案3】:

    试试这个:

    void initDeck(vector<int> &card_deck)
    {
        int i;
        for(i = 0; i <= 51; i++)
        {
            card_deck.push_back(i);
        }
    
    }
    
    
    void shuffleDeck(vector<int> & card_deck)
    {
        int n;
    
            for(n = 51; n >= 0; n--)
            {
                int i = randomize();
                int temp = card_deck[i];
                int temp2= card_deck[n];
                card_deck[n] = temp;
                card_deck[i] = temp2;
    
            }
    
    }
    

    有关生成随机数的信息,请参见 thisthis。或者您可以找到其他更可靠的解决方案。

    【讨论】:

    • 我最初使用的是推回,但它确实停止了我的 while 循环。在第 17 次迭代之后,它将继续一遍又一遍地抽相同的牌。
    • 这是因为随机数被重复了。
    • 感谢您的帮助。但我不明白这在我的 while 循环之后是如何给我一个向量错误的。是不是我的随机数只是给我数字放入我的 int i 然后停止。我运行程序,但现在它在 17 号之后再次停止,给我向量错误。
    猜你喜欢
    • 2018-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多