调试断言失败! vector.earse()调用期间出错

时间:2015-03-11 21:22:01

标签: c++ vector

下面的代码让我觉得“Debug Assertion Failed!”错误。我想我已将其分离为:questions.erase(questions.begin() + number);

代码的目标是随机询问测试库矢量“问题”中的一个问题。我还没有输入所有问题,因为我试图弄清楚手头的机制。

提前感谢您的帮助!

int nomen()
{
    int number;
    string ans = "No Answer";

    cout << "\nIn the Nomenclature Game you will be asked to name chemical compounds or give their UPAC symbols." << endl;

    vector<string> questions;
    vector<string> answers;

    questions.push_back("MgO");
    answers.push_back("magnesium oxide");

    srand((unsigned)time(0));

    number = (rand () % questions.size()) + 1;

    for (int i = 0; i < questions.size(); ++i)
    {
        cout << questions[number] << endl;
        questions.erase(questions.begin() + number);
    }

    return 0;
}

2 个答案:

答案 0 :(得分:0)

questions.erase(questions.begin() + number);不在数组的末尾。

questions.begin()相当于位置0和 number等于questions.size()

所以0 + size = size是向量结尾的1。

答案 1 :(得分:0)

此表达式

number = (rand () % questions.size()) + 1;

产生1(当rand()返回除0之外的任何值)或2(当rand()返回0时)。

您的矢量大小等于1.

因此在本声明中

questions.erase(questions.begin() + number);
如果number等于2,则

迭代器questions.begin() + number无效。如果number等于1,则questions.begin() + number等效 到questions.end()

同样在循环中

for (int i = 0; i < questions.size(); ++i)
{
    cout << questions[number] << endl;
    questions.erase(questions.begin() + number);
}

您正试图删除在前一次迭代中可以删除的相同元素。