2

不断收到此错误“向量下标超出范围”。我确定这是因为我的代码的这一部分。谁能帮我看看我做错了什么

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;
}
4

2 回答 2

6

您在这种情况下分配-1给:subscriptif

if(subscript = -1)

这段代码的意图尚不清楚。

您将在此循环中访问超出向量边界的点,即第一次访问subscriptwhen it is -1,,并且在循环结束时 whensubscript等于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.

于 2013-06-21T23:12:29.567 回答
0
while( (subscript < my_size) && (my_element[subscript] != removalCandidate) )

除非您试图在 Vector 中具有唯一值,否则您不需要 && 与条件的第二部分。您也没有删除“removalCandidate”,因为您在进入 IF 语句之前关闭了循环。

@0x499602D2 是正确的,因为您将使用 -1 的下标检查向量。因此,您将始终超出范围。

最后,您的 while 循环末尾的下标将等于 my_size ,因此在引用时

my_element[subscript]

如果 Vector 的大小为 10 但 Vector 的引用从零开始,则每次都会超出范围。所以你应该引用从 0 到 (my_size-1) 的向量。

于 2013-06-21T23:16:32.050 回答