美文网首页
STL 容器使用 erase 遍历删除的坑

STL 容器使用 erase 遍历删除的坑

作者: _给我一支烟_ | 来源:发表于2019-07-17 14:00 被阅读0次

1. 序列式容器

序列式容器有 vector、deque、list,这里使用 vector 容器来举例说明
在 C++98 和 C++11 中 vector 的 erase 方法删除指定迭代器位置都是返回被删除位置的后一个位置的迭代器。
(vector 和 deque 底层是基于数组的存储方式)删除该迭代器后会导致后面的所有的迭代器失效。
(list 基于链表的存储方式)删除该迭代器之后导致该迭代器本身失效。

惯用删除的方法如下:

// 比如删除 vector<int> vecInt 里面值为0的数据
for(vector<int>::iterator it = vecInt.begin(); it != vecInt.end();)
{
    if(*it == 0)
    {
        it = vecInt.erase(it);
    }
    else
    {
        ++it;
    }
}

2. 关联式容器

关联式容器有 map、multimap、set、multiset,这里使用 map 容器来举例说明。
对于关联容器来说,如果某一个元素已经被删除,那么其对应的迭代器就失效了,不应该再被使用,否则会导致程序无定义的行为。
在 C++98 中 map 的 erase 删除指定迭代器上的位置没有返回值

void erase (iterator position);

在 C++98 中惯用删除的方法如下:

// 比如删除 map<int,int> mapInt 里面value值为0的数据
for(map<int,int>::iterator it = mapInt.begin(); it != mapInt.end();)
{
    if(it->second == 0)
    {
        mapInt.erase(it++);
    }
    else
    {
        ++it;
    }
}

在 C++11 中 map 的 erase 方法删除指定迭代器位置会返回被删除位置的后一个位置的迭代器。

iterator  erase (const_iterator position);

在 C++11 中惯用删除的方法如下:

// 比如删除 map<int,int> mapInt 里面value值为0的数据
for(auto it = mapInt.begin(); it != mapInt.end();)
{
    if(it->second == 0)
    {
        it = mapInt.erase(it);
    }
    else
    {
        ++it;
    }
}

相关文章

网友评论

      本文标题:STL 容器使用 erase 遍历删除的坑

      本文链接:https://www.haomeiwen.com/subject/zjwgkctx.html