当我在class vector
容器中使用erase()
方法时,出现段错误。如何安全地擦除std :: vector中的元素
我在比较两个向量,所以我想从其中一个中删除另一个中不存在的元素。要做到这一点,我使用迭代器和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
感兴趣。
标准的方式来做到这就是所谓的[擦除删除成语(https://en.wikipedia.org/wiki/Erase%E2%80%93remove_idiom) – NathanOliver
如果你真的想这样做你尝试这样做的方式,我会遍历外部循环中的vector1,以及内部循环中的vector 2。这样你就不会从外循环中删除矢量,并且会干扰迭代器的有效性。 – ttemple