You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

删除vector元素时触发Runtime Error的技术求助

问题:vector删除操作触发Runtime Error

我拥有一个已排序的vector<int> v和vector<int> num,以下是我删除v中元素的代码:

vector<int> v; 
vector<int> num; 
// 获取输入
// 示例:v = {1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 4, 6} 
// num.size() = 0 

num.push_back(v[v.size()-1]); // 将v的最大元素加入num
v.erase(v.begin()+v.size()-1); // 删除该元素
while(v.size() > 0) {
    num.push_back(v.back()); // 将v的最大元素加入num
    v.erase(v.begin()+v.size()-1); // 删除该元素
    for(int i = 0; i < num.size()-1; i++) // 检查num中除刚添加元素外的所有元素
    {
        int ggcd = __gcd(num[num.size()-1], num[i]); 
        int fnd = findv(v, ggcd); // 计算最大元素与num[i]的GCD并查找
        v.erase(v.begin()+fnd); // 删除对应元素
        fnd = findv(v, ggcd); // 重复一次
        v.erase(v.begin()+fnd);
    }
}

其中findv函数通过二分查找找到第一个不小于x的元素的索引:

int findv(const vector<int>& v, int x) // 查找函数
{
    int l = 0, r = v.size(), mid; 
    while(r-l > 1)
    {
        mid = (l+r)/2; 
        if(v[mid] < x) l = mid; 
        else if(v[mid] > x) r = mid; 
        else return mid; 
    }
    return l; 
}

初始时v的大小为某个n的平方(示例中n=4,v大小为16),理论上while循环中v不会提前为空。但Runtime Error出现在for循环内的v.erase(v.begin()+fnd)语句,而while循环外的erase操作完全正常。

我尝试过以下几种修改,均无法解决问题:

  • 替换erase的索引(比如改为v.begin()+0),仍触发错误
  • 使用remove配合erase的方式:
    v.erase(remove(v.begin(), v.end(), __gcd(num[num.size()-1], num[i])), v.end());
    
    但这种方式会删除所有对应值的元素,不符合需求
  • 使用find迭代器查找再删除:
    vector<int>::iterator it = find(v.begin(), v.end(), __gcd(num[num.size()-1], num[i]));
    int index = distance(v.begin(), it);
    v.erase(v.begin()+index);
    it = find(v.begin(), v.end(), __gcd(num[num.size()-1], num[i]));
    index = distance(v.begin(), it);
    v.erase(v.begin()+index);
    
    仍触发Runtime Error

数学归纳可证明循环中元素不会耗尽,此代码为Codeforces 582A题的解决方案。


内容的提问来源于stack exchange,提问作者SleepingUgly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 19:03:26