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 @ 2024-11-03 17:37  sgqmax  阅读(6)  评论(0编辑  收藏  举报