我正在为一个类编写一个程序,其中包含以下描述:
“夏娃是一位漂亮的公主,很多追求者都来找她。她决定以下程序决定她会嫁给谁。她会把男人排成一行,并根据他们的位置给他们一个号码(第一个)当她到达第三个人的时候,那个人就会被排成一行。每当她到达终点时,她就会从头开始计算。最后一个人在线会有幸与她结婚。“问题是,每次运行代码时,我都会得到一个非常大的数字作为我的答案。使用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;
}
答案 0 :(得分:1)
您的列表未填充。您的setUpSuitors
函数的签名为setUpSuitors(vector<int> v)
,这意味着vector
将按值传递,也就是说,该函数可以访问该向量的副本。如果要修改函数内部的向量,则需要通过引用传递它,如下所示:setUpSuitors(vector<int>& v)
(注意&
)。
你得到一些荒谬的数字的原因是你没有从chooseWinner返回,因为你采取了return v[0];
语句的假分支。 (实现细节导致使用伪随机值而不是返回。)
至于崩溃:
错误消息告诉您尝试使用v.erase(v.begin()+suitorTotal);
从向量中删除时发生问题。
1)suitorTotal
和suitorCounter
都没有在类中实际初始化。例如,你可以在构造函数中传递它们来修复它,或者之后设置它们。
2)除非该名称具有误导性,否则v.begin() + suitorTotal
将为您提供与v.end()
等效的迭代器,这在erase
中不起作用。您需要重新考虑选择下一个要删除的求助者的逻辑。
答案 1 :(得分:0)