有关迭代器erase后失效的问题
序列式容器vector,deque
使用erase删除迭代器后,后面的元素的迭代器会失效。但是erase会返回下一个有效的迭代器。
int main() { vector<int> v{ 1,2,3,4 }; vector<int>::iterator it = find(v.begin(), v.end(), 1); auto it1 = v.erase(it); cout << *it1 << endl; } |
上面代码输出2.
数组形式的容器在进行erase时,会在删除前使it指向下一个位置,同时后面的数据会向前面移动一个位置
int main() { vector<int> v{ 1,2,3,4 }; vector<int>::iterator it = find(v.begin(), v.end(), 1); v.erase(it); cout << *it << endl; } |
上面代码输出也为2.(可以不用新的迭代器记录!)
关联式容器set,map
使用erase删除迭代器后,当前元素的迭代器失效,但是后面的元素的迭代器还有效。这就需要记录下一个元素的迭代器了。
int main() { set<int> s{ 1,2,3,4 }; set<int>::iterator it2 = s.find(1); s.erase(it2++); cout << *it2 << endl; } |
上面代码输出2.
序列式容器list
erase会返回下一个有效的迭代器,因此可以使用vector的方法。分配的内存不是连续的,因此可以采用set的方法。
int main() { list<int> l{ 1,2,3,4 }; list<int>::iterator it3 = find(l.begin(), l.end(), 1); auto it4 = l.erase(it3); cout << *it4 << endl; } |
int main() { list<int> l{ 1,2,3,4 }; list<int>::iterator it5 = find(l.begin(), l.end(), 1); l.erase(it5++); cout << *it5 << endl; } |
上面代码都输出2.