C++迭代器失效
迭代器失效
序列式容器
vector
deque
使用连续分配的内存
删除一个元素,会导致后面的元素前移
不能使用如erase(iter++)
这种方式删除元素
erase()
会返回下一个有效的迭代器
/*
for(iter=v.begin(); iter!=v.end(); iter++){
if(*iter>3){
v.erase(iter); // iter invalid, iter++ error
}
}
*/
for(iter=v.begin(); iter!=v.end();){
if(*iter==3){
iter= v.erase(iter); // erase() return next iter
}else{
iter++;
}
}
链表式容器
list
插入或删除节点不会影响其他节点,仅使当前的iterator失效
erase()
会返回下一个有效的迭代器
可以递增当前迭代器,或获取下一个有效迭代器
std::list<int> l{1,2,3,4};
std::list<int>::iterator iter;
for(iter=l.begin(); iter!=l.end(); iter++){
if(*iter==2){
l.erase(iter++);
}
}
或
std::list<int> l{1,2,3,4};
std::list<int>::iterator iter;
for(iter=l.begin(); iter!=l.end();){
if(*iter==2){
iter= l.erase(iter);
}else{
iter++;
}
}
关联式容器
map multimap
set multiset
平衡二叉树或红黑树结构,插入或删除节点不会影响其他节点
插入不会使任何迭代器失效
erase()
只是使当前迭代器失效,返回值为void
,采用erase(iter++)
方式删除
单个节点在内存中地址没有变化,变化的是节点间的指向关系
map<int, string> mp{{2,"22"}, {3,"33"}};
mp.insert(make_pair(1,"11"));
map<int, string>::iterator iter;
for(iter=mp.begin(); iter!=mp.end();){
if(iter->first==2){
mp.erase(iter++);
}else{
iter++;
}
}