c++ - 调试断言失败! vector 下标超出范围 C++

标签 c++ vector

我也尝试使用 v.erase(v.begin()+j) 但我仍然收到“调试断言失败错误框。此函数假设删除重复项。例如:{1,2,6,8 ,2,8} 是 vector 的元素。此函数必须使其成为 {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() 程序正常工作时。

最佳答案

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

因此,您最终访问的项目超出了 vector 的限制。

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

关于c++ - 调试断言失败! vector 下标超出范围 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33681484/

相关文章:

c++ - 在 opengl c++ 中计算顶点法线(gouraud 着色)

c++ - 在堆上初始化 vector 数组,C++

c++ - 生成组合的动态迭代规划

c++ - 是否有 C++ 的在线名称解码器?

c++ - 通过引用将二维数组传递给函数

c++ - 将宽 CString 转换为 char*

c++ - 如何解决字段 'classname'有不完整的类型错误

c++ - 将 c 数组分配给 C++ vector

r - 在 R 中创建向量序列

c++ - Boost日志宏解释