當我在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