程序忽略while循环内容,在强制访问循环内的方法时崩溃

时间:2014-02-06 23:45:16

标签: c++

我正在为一个类编写一个程序,其中包含以下描述:

“夏娃是一位漂亮的公主,很多追求者都来找她。她决定以下程序决定她会嫁给谁。她会把男人排成一行,并根据他们的位置给他们一个号码(第一个)当她到达第三个人的时候,那个人就会被排成一行。每当她到达终点时,她就会从头开始计算。最后一个人在线会有幸与她结婚。“

问题是,每次运行代码时,我都会得到一个非常大的数字作为我的答案。使用cout测试表明程序没有触及while循环的内容。当删除while循环时,程序崩溃时会出现'vector iterator + offset out of range'和“Standard C ++ libraries out of range”。

我知道while循环本身存在一些错误导致程序崩溃,而且我已经花了好几天试图弄清楚是什么。我不明白的是为什么程序首先忽略while循环。任何和所有建议将不胜感激。

// EveSuitor.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <vector>
#include <iostream>
using namespace std;

class EveSuitor
{
    vector<int> newList;

public:

    EveSuitor::EveSuitor(vector<int> list)
    {
    vector<int> newList = list;
    }


    void setUpSuitors(vector<int>list);
    int chooseWinner(vector<int>list);

    int suitorCounter;
    int suitorTotal;

};



void EveSuitor::setUpSuitors(vector<int>v)
{
    int numOfSuitors;
    cout<< "Enter in the number of suitors that are there: ";
    cin>> numOfSuitors;

    for (int i = 0; i < numOfSuitors; i++)
    {
        v.push_back(i);
    }

    for (unsigned int j = 0; j < v.size(); j++)
    {
        cout<< v[j] << " ";
    }
}
int EveSuitor::chooseWinner(vector<int>v)
{
    while (v.size() > 1)
    {
        v.erase(v.begin()+suitorTotal);

        for (unsigned int j = 0; j < v.size(); j++)
        {
            cout<< v[j] << " ";
        }   

        suitorTotal = suitorTotal + suitorCounter;

        if (suitorTotal > v.size())
        {
            suitorCounter = suitorTotal - v.size();//This will reset the counter for the suitor, so that it will move on to the next suitor at the beginning of the list.
            suitorTotal = 0;
        }
        else
        {
            suitorCounter = suitorCounter + 3;
            suitorTotal = suitorTotal + 3;
        }
    }
    if (v.size() == 1)
    {
        return v[0];
    }

}

int _tmain(int argc, _TCHAR* argv[])
{

    int suitorTotal = 3;
    int suitorCounter = 3;
    vector<int>listOfSuitors;

    EveSuitor list(listOfSuitors);

    list.setUpSuitors(listOfSuitors);
    int winner = list.chooseWinner(listOfSuitors);

    cout<<"The position you should be at is: " << winner;
    return 0;
}

2 个答案:

答案 0 :(得分:1)

您的列表未填充。您的setUpSuitors函数的签名为setUpSuitors(vector<int> v),这意味着vector将按值传递,也就是说,该函数可以访问该向量的副本。如果要修改函数内部的向量,则需要通过引用传递它,如下所示:setUpSuitors(vector<int>& v)(注意&)。

你得到一些荒谬的数字的原因是你没有从chooseWinner返回,因为你采取了return v[0];语句的假分支。 (实现细节导致使用伪随机值而不是返回。)


至于崩溃:

错误消息告诉您尝试使用v.erase(v.begin()+suitorTotal);从向量中删除时发生问题。

有两个问题

1)suitorTotalsuitorCounter都没有在类中实际初始化。例如,你可以在构造函数中传递它们来修复它,或者之后设置它们。

2)除非该名称具有误导性,否则v.begin() + suitorTotal将为您提供与v.end()等效的迭代器,这在erase中不起作用。您需要重新考虑选择下一个要删除的求助者的逻辑。

答案 1 :(得分:0)

您的列表未正确填充。阅读通过参考vs值传递。

这个问题有一些很好的答案:

Pass by Reference / Value in C++