【发布时间】:2018-01-27 12:22:54
【问题描述】:
当我在 class vector 容器中使用 erase() 方法时出现段错误。
我正在比较两个向量,因此我想从其中一个向量中删除另一个向量中不存在的元素。为此,我使用了迭代器和erase(),如下所示:
#include <vector>
int main () {
std::vector<int> vector1 {6,7,5,44,3,10,9,17,1};
std::vector<int> vector2 {1,2,3,5,8};
for (std::vector<int>::iterator it (vector2.begin()); it != vector2.end(); ++it) {
bool equal (false);
for (std::vector<int>::iterator jt (vector1.begin()); jt != vector1.end(); ++jt) {
if (*it == *jt) {
equal = true;
break ;
}
}
if (!equal) {
vector2.erase(it);
}
}
return 0;
}
导致段错误的原因是删除了vector2 (8) 中的最后一个元素,因为erase() 无法成功地将迭代器从之前的end() 位置(不再存在)移动到新位置.
如何防止这种情况发生?我知道unordered_set 可能是此操作的合适容器,但这里我对vector 感兴趣。
【问题讨论】:
-
执行此操作的标准方法称为erase-remove idiom
-
如果您真的想按照您尝试的方式进行操作,我将在外循环中遍历vector1,在内循环中遍历vector 2。这样您就不会从外循环中的向量中删除并干扰迭代器的有效性。