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;
}

 

posted @ 2023-03-23 09:18  lypbendlf  阅读(114)  评论(0编辑  收藏  举报