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++;
  }
}
posted @   sgqmax  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
点击右上角即可分享
微信分享提示