【发布时间】:2010-09-26 14:53:49
【问题描述】:
我有以下玩具代码,旨在从向量中删除重复项:
void overlap_removal(vector<int> &vec1, vector<int> &vec2) {
for (vector<int>::iterator it1 = vec1.begin(); it1 != vec1.end(); ++it1) {
for (vector<int>::iterator it2 = vec2.begin(); it2 != vec2.end(); ++it2) {
if ((*it1)*(*it2) < 10) {
vec1.erase();
}
}
}
}
我在实际代码中进行了稍微复杂的比较,但不想混淆问题。问题是在执行此操作后不可避免地会出现分段错误:我认为这是因为我删除了一个元素,然后继续循环遍历同一个向量。
我怎样才能使代码工作?这甚至是正确的起点吗? 提前致谢
【问题讨论】:
-
顺便说一句,这段代码是等价的:
void overlap_removal(vector<int> vec1, vector<int> vec2) {},除了它不会导致分段错误。 -
是的,我在复制代码时忘记输入 &。干杯
-
@ybungalobill 告诉他为什么是一样的! :P (您通过 按值 传递您的向量,因此它们被复制并且原件未被修改。您需要通过指针(
vector<int> *vec1)或更好地通过引用(vector<int>& vec1)。 -
代码现在进行了相应的修改。
-
另外,经过修改以表明等价不是问题,这只是直接比较。
标签: c++ stl vector iterator erase