向量中的分段错误

时间:2014-04-15 04:49:40

标签: c++ segmentation-fault

这是我为Topcoder SRM编写的代码。但是这里存在一个我无法弄清楚的分段错误。你能帮我解决一下吗?

问题是 -

这项任务是关于模拟游戏Yahtzee第一阶段的得分,其中使用了五个骰子。得分由滚动后向上模具面上的值确定。玩家可以选择一个值,所有显示所选值的骰子都被认为是活动的。分数只是活动骰子上的值的总和。 比方说,例如,玩家最终会出现显示2,2,3,5和4的模具面。选择值2会使骰子显示2活动并产生2 + 2 = 4的分数,同时选择5个制作一个模具显示5个活跃,得分为5。 你的方法将把矢量投掷作为输入,其中每个元素代表骰子的向上面,并用这些值返回最大可能得分。

约束 -

折腾将完全包含五个元素。  每个元素都在1到6之间

#include <iostream>
#include <vector>

using namespace std;

class YahtzeeScore
{
  public:
  int maxPoints(vector<int> toss);
};

int YahtzeeScore::maxPoints(vector <int> toss)
{ 
  vector<int> ret;
  vector <int>::iterator v = toss.begin();
  vector<int>::iterator w = toss.begin();
  for (;v != toss.end(); v++)
  {
    int s=0;
    for (;w != toss.end(); w++)
    {
      if ( w!=v && *w==*v) s++;
    }
     ret.push_back(s);
  }

  vector<int>::iterator it = ret.begin();
  for (; it!=ret.end(); it++)
  {
    if (*v>*(v+1))
    {
      int temp = *v;
      *v = *(v+1);
      *(v+1)=temp;
    }
  } 
  return ret[4];
}


int main()
{
  YahtzeeScore ob;
  vector<int> something;
  vector<int>::iterator it = something.begin();
  while (it != something.end())
  {
    int a;
    cin >> a;
    something.push_back(a);
  }
  cout << ob.YahtzeeScore::maxPoints(something);
}

5 个答案:

答案 0 :(得分:1)

if (*v>*(v+1))行,v指向end,因此您无法取消引用它。

我猜你的意思是it而不是v,但是如果*(it+1)指向一端,那么it仍然无效。

另外,您应该在执行ret之前检查ret[4]的大小。或者ret.at(4),所以至少你得到一个例外而不是段错误。

答案 1 :(得分:1)

注意:您应该通过调试器运行它。

main()中的这段代码:

vector<int>::iterator it = something.begin();
while (it != something.end())

it将永远是something.end(),因为某些东西是空的。这意味着它永远不会读取任何输入,这意味着您将空向量传递给maxPoints。由于maxPoints为空且toss为空,ret个循环都不会运行。所以ret[4]会导致段错误。

如您所知,您需要5个输入,只需使用以下内容:

for (int i = 0; i < 5; i++)
{
    int a;
    cin >> a;
    something.push_back(a);
}

答案 2 :(得分:0)

问题的根源在这个块中:

while (it != something.end())
{
  int a;
  cin >> a;
  something.push_back(a);
}

首次进行检查,it == something.end(),因为something为空。

您将空对象传递给ob.YahtzeeScore::maxPoints()return ret[4]尝试从空向量({{1}})获取第5个项目,这会导致分段违规。

答案 3 :(得分:0)

执行一个简单的循环for( int face=1; face<6; face++)并对五个面进行6次扫描以获得相等的face。求它们并存储找到的最大总和。完成。

答案 4 :(得分:0)

Vector不会初始化,这会导致返回ret [4]时出现段错误。

vector<int> something;
vector<int>::iterator it = something.begin();
while (it != something.end())

这个循环永远不会运行,因为vector是空的并且它指向something.end(), 和循环结束,其中包含0个元素。 考虑到包含至少5个元素的东西比你调用maxPoints。 由于某些内容不包含任何内容,return ret[4];不正确,因此您获得了segfaul。 建议: - maxPoints有明确的前提条件:toss.size()== 5.使用断言 - 我建议使用maxPoints(const vector<int> & toss);,这将消除不必要的副本。