删除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迭代器查找再删除:
仍触发Runtime Errorvector<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);
数学归纳可证明循环中元素不会耗尽,此代码为Codeforces 582A题的解决方案。
内容的提问来源于stack exchange,提问作者SleepingUgly
相关产品推荐
相关产品推荐

