为什么我的矢量下标超出范围?

时间:2013-06-21 22:45:52

标签: c++ vector compiler-errors

继续收到此错误“矢量下标超出范围”。我确定它是因为我的代码的这一部分。任何人都可以帮我看看我做错了什么

bool set::remove(SET_ELEMENT_TYPE removalCandidate)
{
  int subscript = positionOf(removalCandidate);
  while( (subscript < my_size) && (my_element[subscript] != removalCandidate))
  {
     subscript++;
  }
  if(subscript = -1)
  {
    if(subscript == my_size)
      return false;
    else {
      while (subscript < my_size)
      {
        my_element[subscript] = my_element[subscript + 1];
        subscript++;
      }
      my_size--;
      return true;
    }
    return false;
  }
  return 0;
}

2 个答案:

答案 0 :(得分:6)

您在此-1条件中将subscript分配给if

if(subscript = -1)

此代码的用意不明确。

您将在此循环中访问超出矢量边界的位置,subscript-1,时的第一次访问时,以及subscript相等时的循环结束时访问到my_size - 1

while (subscript < my_size)
{
    my_element[subscript] = my_element[subscript + 1];
    subscript++;
}

这是因为my_element[-1]是第一个元素的后面一个,而my_element[my_size]正在读取一个超过向量的最后一个元素。你可以改变你的测试:

while (subscript + 1 < my_size)
{ //...

这修复了while循环结束时的界限,但您应该修复if条件以不分配给subscript

答案 1 :(得分:0)

while( (subscript < my_size) && (my_element[subscript] != removalCandidate) )

除非您尝试在Vector中使用唯一值,否则您不需要&amp;&amp;与条件的第二部分。您也没有删除'removalCandidate',因为您在转到IF语句之前关闭了循环。

@ 0x499602D2是正确的,您将使用-1的下标检查Vector。所以你总是会超出范围。

最后,while循环结束时的下标将等于my_size,因此在引用时

my_element[subscript]
如果Vector的大小为10但Vector的引用从零开始,那么

每次都会超出范围。所以你应该将Vector从0引用到(my_size-1)。