【问题标题】:Why is my vector subscript out of range?为什么我的向量下标超出范围?
【发布时间】:2013-06-21 22:45:51
【问题描述】:

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

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

【问题讨论】:

  • 你用什么称呼它,my_size是什么?
  • 在if (subscript = 1) 中应该是== 而不是=。另外,当 if 语句仅在 subscript 为 -1 时运行时,为什么还要检查 subscript 是否等于另一个值?
  • @0x499602D2 大声笑,不知道我要去哪里。被带走了。所以我根本不需要那个代码?
  • @0x499602D2 set::set() { my_size = 0; my_index = 0; my_capacity = DEFAULT_INITIAL_SET_CAPACITY; my_element.resize(my_capacity);
  • 另外,如果subscript 可能是-1(或my_element 的任何其他无效索引),您应该在尝试做之前检查它作为您在方法中做的第一件事[] 运算符与它

标签: c++ vector compiler-errors


【解决方案1】:

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

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。

【讨论】:

    【解决方案2】:
    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) 的向量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多