map/vector erase删除学习
转自:https://blog.csdn.net/hjxu2016/article/details/115137332
1.map
1.1 erase
C++11中,erase删除迭代器,返回的是下一个元素的迭代器:
iterator erase (const_iterator position);//按迭代器删除一个,返回下一个元素的迭代器 size_type erase (const key_type& k);//按照key删除 iterator erase (const_iterator first, const_iterator last);//按迭代器删除一段,返回下一个元素的迭代器
对于关联容器(如map, set, multimap,multiset),删除当前的iterator,仅仅会使当前的iterator失效。因为map之类的容器,使用了红黑树来实现,插入、删除一个结点不会对其他结点造成影响。
1.2 删除操作
#include <iostream> #include <map> using namespace std; int main() { map<int, string> m{{1, "one"}, {2, "two"},{3, "three"}, {4, "four"}, {5, "five"}}; for(auto iter = m.begin(); iter != m.end();) { if (iter->first == 4) { iter = m.erase(iter);//赋值为返回的有效迭代器 } else ++iter; } for(auto iter = m.begin(); iter != m.end(); iter++) { std::cout << iter->first <<" " << iter->second << std::endl; } std::cout << "Hello, World!" << std::endl; return 0; }
//错误的写法是对无效的迭代器做++操作。迭代器++的操作是在操作它保存的节点指针,所以当这个节点被删除的时候,改节点所指向的指针是无法确定的,也就是可能还是以前的数据,也可能是已经其他毫不相关的数据了,这样的行为被叫做未定义的行为,不一定会core。
如果不做 iter = m.erase(iter);直接对erase后,iter++,那么相当于对一个失效的迭代器操作。可能会导致程序崩溃。所以在操作迭代器前要保证它是有效的,未被删除的。
2.vector
https://blog.csdn.net/Xiaohei00000/article/details/49382521
iterator erase (const_iterator position); //按迭代器删除一个元素,返回值是一个迭代器,指向删除元素的下一个元素; iterator erase (const_iterator first, const_iterator last);// 按迭代器删除一段元素,返回值也是一个迭代器,指向最后一个删除元素的下一个位置。
调用erase()函数后,vector后面的元素会向前移位,形成新的容器,这样原来指向删除元素的迭代器就失效了。
int main() { vector<uint32_t> arr{1,2,3,0,0}; for(vector<uint32_t>::iterator it=arr.begin(); it!=arr.end(); ){ if(*it == 0) { it = arr.erase(it); // 也是这样删除 } else { ++it; } } for_each(arr.begin(),arr.end(),[](uint32_t a){cout<<a<<" ";}); cout<<endl; return 0; }