gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 07:07:12 24 4
gpt4 key购买 nike

我正在为具有以下描述的类编写程序:

“夏娃是一位美丽的公主,许多追求者都来追求她。她决定按照以下程序来决定她嫁给谁。她会把男人排成一行,并根据他们的位置给他们一个编号(1代表第一位)排到第二个2,以此类推。每当她排到第三个人时,该人就会被淘汰出线。当她走到线尾时,她会从头开始继续数。最后一个人排队将有幸与她结婚。”

问题是,每次我运行代码时,我都会得到一个非常大的数字作为我的答案。使用 cout 进行测试表明该程序没有触及 while 循环的内容。删除 while 循环后,程序崩溃并显示“vector 迭代器 + 偏移量超出范围”和“标准 C++ 库超出范围”。

我知道 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;
}

最佳答案

您的列表未被填充。你的setUpSuitors函数的签名为 setUpSuitors(vector<int> v) ,这意味着 vector将按值传递,也就是说,该函数将有权访问 vector 的拷贝。如果你想修改函数内部的 vector ,你需要通过引用传递它,像这样:setUpSuitors(vector<int>& v) (注意 & )。

你得到一些可笑数字的原因是你没有从 chooseWinner 返回,因为你采取了 if 的错误分支来保护 return v[0];。陈述。 (实现细节导致使用伪随机值而不是返回值。)


至于崩溃:

错误消息告诉您问题发生在尝试使用 v.erase(v.begin()+suitorTotal); 从 vector 中删除时.这有两个问题

1) suitorTotal 都不是和 suitorCounter实际上是在类内部初始化的。例如,您可以将它们传递到构造函数中以解决此问题,或者在之后设置它们。

2) 除非名称具有误导性,v.begin() + suitorTotal会给你相当于 v.end() 的迭代器, 这在 erase 中不起作用.您需要重新考虑选择接下来要删除哪个追求者的逻辑。

关于c++ - 程序忽略 while 循环内容,当强制访问循环内的方法时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21616511/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com