STL 迭代器 erase 使用陷阱
我们通常在操作容器删除某元素操作时,会遇到一些迭代器失效的问题,我们就清空容器操作来作说明
vector 容器清空
vector 清空的正确示例
vector<int> vec{1, 2, 3};
vector<int>::iterator iter = vec.begin();
while (iter != vec.end()) {
vec.erase(iter);
}
或者
vector<int> vec{1, 2, 3};
vector<int>::iterator iter = vec.begin();
while (iter != vec.end()) {
iter = vec.erase(iter);
}
或者
vector<int> vec{1, 2, 3};
vector<int>::iterator iter;
for (iter = vec.begin(); iter != vec.end(); ) {
vec.erase(iter);
}
错误示例
vector<int> vec{1, 2, 3};
vector<int>::iterator iter = vec.begin();
while (iter != vec.end()) {
vec.erase(iter++);
}
或者
vector<int> vec{1, 2, 3};
vector<int>::iterator iter;
for (iter = vec.begin(); iter != vec.end(); iter++) {
vec.erase(iter);
}
deque 容器清空
deque 清空的正确示例
deque<int> deq{1, 2, 3};
deque<int>::iterator iter = deq.begin();
while (iter != deq.end()) {
iter = deq.erase(iter);
}
或者
deque<int> deq{1, 2, 3};
deque<int>::iterator iter;
for (iter = vec.begin(); iter != vec.end(); ) {
iter = vec.erase(iter); // 这里需要赋值,否则失败
}
错误示例
deque<int> deq{1, 2, 3};
deque<int>::iterator iter = deq.begin();
while (iter != deq.end()) {
deq.erase(iter++);
}
或者
deque<int> deq{1, 2, 3};
deque<int>::iterator iter;
for (iter = vec.begin(); iter != vec.end(); iter++) {
vec.erase(iter);
}
list 容器清空
list 清空的正确示例
list<int> lst{1, 2, 3};
list<int>::iterator iter = lst.begin();
while (iter != lst.end()) {
lst.erase(iter++);
}
或者
list<int> lst{1, 2, 3};
list<int>::iterator iter = lst.begin();
while (iter != lst.end()) {
iter = lst.erase(iter);
}
或者
list<int> lst{1, 2, 3};
list<int>::iterator iter;
for (iter = lst.begin(); iter != lst.end(); ) {
lst.erase(iter++);
}
错误示例
list<int> lst{1, 2, 3};
list<int>::iterator iter = lst.begin();
while (iter != lst.end()) {
lst.erase(++iter);
}
或者
list<int> lst{1, 2, 3};
list<int>::iterator iter;
for (iter = lst.begin(); iter != lst.end(); iter++) {
lst.erase(iter);
}
set 容器清空
set 清空的正确示例
set<int> s{1, 2, 3};
set<int>::iterator iter = s.begin();
while (iter != s.end()) {
s.erase(iter++);
}
或者
set<int> s{1, 2, 3};
set<int>::iterator iter = s.begin();
while (iter != s.end()) {
iter = s.erase(iter);
}
或者
set<int> s{1, 2, 3};
set<int>::iterator iter;
for (iter = s.begin(); iter != s.end(); ) {
s.erase(iter++);
}
错误示例
set<int> s{1, 2, 3};
set<int>::iterator iter = s.begin();
while (iter != s.end()) {
s.erase(iter);
iter++;
}
或者
set<int> s{1, 2, 3};
set<int>::iterator iter;
for (iter = s.begin(); iter != s.end(); iter++) {
s.erase(iter);
}
map 容器清空
map 清空的正确示例
map<int, int> m({{1, 1}, {2, 2}, {3, 3}});
map<int, int>::iterator iter = m.begin();
while (iter != m.end()) {
iter = m.erase(iter);
}
或者
map<int, int> m({{1, 1}, {2, 2}, {3, 3}});
map<int, int>::iterator iter = m.begin();
while (iter != m.end()) {
m.erase(iter++);
}
或者
map<int, int> m({{1, 1}, {2, 2}, {3, 3}});
map<int, int>::iterator iter = m.begin();
for (iter = m.begin(); iter != m.end(); ) {
iter = m.erase(iter);
}
或者
map<int, int> m({{1, 1}, {2, 2}, {3, 3}});
map<int, int>::iterator iter = m.begin();
for (iter = m.begin(); iter != m.end(); ) {
s.erase(iter++);
}
错误示例
map<int, int> m({{1, 1}, {2, 2}, {3, 3}});
map<int, int>::iterator iter = m.begin();
while (iter != m.end()) {
m.erase(iter);
iter++;
}
或者
map<int, int> m({{1, 1}, {2, 2}, {3, 3}});
map<int, int>::iterator iter;
for (iter = m.begin(); iter != m.end(); iter++) {
m.erase(iter);
}