【问题标题】:"Expression cannot seek vector iterator after end "“表达式不能在结束后寻找向量迭代器”
【发布时间】:2021-12-26 03:24:55
【问题描述】:

我正在尝试制作一个非常简单的记忆游戏,但我遇到了以下向量问题。 Expression cannot seek vector iterator after end 这是我的代码

#include <iostream>
#include <vector>
#include <algorithm>
#include <random>
using namespace std;

void play();
void filler();
char faceup(int);

vector<char> cards (50);
int candy= 0;

int main()
{
    filler();
    play();
}
char faceup(int C) {
    return cards[C];
}
void play() {
    int n,l;
    char p, s;
    for (int i = 0; i < cards.size(); i++)
    {
        cout << cards[i];
    }
    cout << endl;
    while (candy<50)
    {
        cout << "choose first card"<<endl;
        cin >> n;
        cout << "choose second card"<<endl;
        cin >> l;
        if (l == n) {
            cout << "the cards are the same, try it again"<<endl;
        }
        else
        {
            p = faceup(n);
            s = faceup(l);
            cout << "The first card is: " + p;
            cout << "The second card is: " + s;
            if (s==p)
            {
                candy++;
                cards.erase(cards.begin()+s);
                cards.erase(cards.begin() + p);
            }
        }
    }
}
void filler() {
    //random_device rd;
    //default_random_engine rng(rd());
    int accountant = 0;
    for (int i = 0; i < cards.size()/2; i++)
    {
        for (int o = 0; o < 2; o++) {
            cards[accountant] = i+65;
            accountant++;
        }
    }
    //shuffle(cards.begin(), cards.end(), rng);
}

我键入的任何整数都会发生错误。我使用了visual studio的编译器,然后我使用了dev c++。在所有情况下,我都会遇到相同或相似的错误

提前一百万谢谢

【问题讨论】:

  • 请将其缩减为minimal reproducible example。特别是,删除手动输入,除非确实需要重现问题。作为这里的新用户,也可以使用tour 并阅读How to Ask
  • 当您使用调试器运行此代码时,您看到了什么?这就是调试器的用途,如果您不知道如何使用它,这是一个学习在调试器中一次运行程序、监控所有变量及其值变化并分析您的程序的好机会程序的逻辑和执行。您应该可以使用您的调试器在这个和您编写的所有未来程序中发现所有简单的问题,全部由您自己完成。
  • cout &lt;&lt; "The first card is: " + p; 应该是 cout &lt;&lt; "The first card is: " &lt;&lt; p;。将char 添加到字符串文字不会将字符附加到它,而是将ascii 值添加到它
  • 全局变量是个坏习惯。如果您需要多个函数来访问变量,请将其作为参数传递。所有大写通常用于宏,将它们用于变量会使大多数程序员感到困惑。而且您没有对您的输入进行边界检查或其他验证。
  • 提示:cards 向量将填充从65 开始的值,然后上升。这些值将不能用作向量本身的索引,并且当添加到 begin() 迭代器时将指向边界之外。

标签: c++ vector


【解决方案1】:

在您的代码中,在第 11 行,您定义了一个长度等于 50 的向量,如果我们为向量指定一个 0 到 49 之外的数字,则程序不应运行。 您在程序的第 48 行和第 49 行遇到了我上面提到的错误。 例如,如果用户输入他的卡号 0 和 1,大小 s 和 p 等于 66,第 48 和第 49 行说要转到我们的向量索引 66,这会给运行我们的程序带来问题。

enter code here
             //////////error/////////////////////////
            cards.erase(cards.begin()+s);
            cards.erase(cards.begin() + p);
             //////////error/////////////////////////

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-19
    • 2013-02-07
    相关资源
    最近更新 更多