【问题标题】:Debug Assertion Failed! Vector subscript out of range c++调试断言失败!向量下标超出范围c ++
【发布时间】:2016-02-14 08:52:56
【问题描述】:

我也尝试使用 v.erase(v.begin()+j) 但我仍然收到“调试断言失败错误框。此功能假设擦除重复项。例如:{1,2,6,8 ,2,8} 是向量的元素。这个函数必须使它成为 {1,2,6,8}。

 void removeDup(vector<int>& v)
    {
    vector<int> x;
    int i,j,size;
    size=v.size();
    for(i=0;i<size;i++)
        {
         for(j=1;j<size;j++)
         {
          if(v[i]==v[j])
          {
            while(v.back()!=v[j])
            {
                x.push_back(v.back());
                v.pop_back();
            }
           v.pop_back();
           while(!x.empty())
           {
               v.push_back(x.back());
               x.pop_back();
           }
          }
         }
     }
    }

问题发生在 if(v[i]==v[j]) 内部 当我擦除 2 而函数和 v.pop_back() 程序正常工作时没有错误。

【问题讨论】:

  • 结果不应该是[1, 2, 6, 8]吗?
  • 是的,你是对的,我的错

标签: c++ vector


【解决方案1】:

您正在计算向量v 的大小并将其用作循环迭代计数限制。不幸的是,每当您在循环内调用pop_back 时,您都会从v 中删除项目——这会减小v 的大小,但您的循环仍将尝试访问v 中的所有项目当您在开始时计算大小时

因此,您最终会访问超出向量限制的项目。

使用向量时,使用迭代器通常更有用。看看这个类似的 SO question and answer,因为它可能会帮助你 Erasing elements from a vector

【讨论】:

  • 当我使它 int size=v.size() 大小稳定?我当然可能是错的,只是我这么认为
  • @user3322385 一个例子:假设你一开始有 10 个项目。您在循环中删除了一个,因此新大小为 9。您仍然尝试访问第 10 个项目,但它不再存在 - 这是向量边界之外的访问冲突
  • 您可以在从向量中删除元素时减少size
猜你喜欢
  • 2016-05-02
  • 1970-01-01
  • 2017-06-18
  • 2021-12-22
  • 1970-01-01
  • 2021-06-29
  • 1970-01-01
  • 1970-01-01
  • 2021-03-13
相关资源
最近更新 更多