主要是看不同容器在C++98和C++11的不同表现

序列化容器

C++98和C++11的vector的erase()接口没啥使用区别

从简单的测试例子讲解

vector<int> vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);

删除前的内存

for (vector<int>::iterator iter = vec.begin(); iter != vec.end();)
{
    if (*iter == 2)
    {
        vec.erase(iter++);   //1运行完:iter——0x014E5078
        // iter = vec.erase(iter); //2运行完:iter—0x014E5074
    }
    else
    {
        iter++;
    }
};

执行删除后的内存变化

执行完 2 iter = vec.erase(iter)之后   迭代器的变化

没有具体去看erase()函数的实现,看内存变化,应该是把删除的数据之后的数据整体前移,对应的end()迭代器前移。

1vec.erase(iter++) 为什么不行呢,是因为iter是在原来的迭代器上++,而vector执行erase()之后内存发生变化,导致原有迭代器失效。iter指向和end()一致,异常报错。

序列化容器,erase()会导致原有迭代器失效,循环删除只能使用 iter = vec.erase(iter)

关联性容器

执行erase()之后,关联性容器的迭代器并不失效,所以可以使用map.earse(iter++)

set、map

C++98

map和set的earse()返回值void
只能使用 map.earse(iter++)

C++11

map.earse返回值是删除的迭代器的下一个
所以可以使用 iter = map.earse(iter)
也可以使用 map.earse(iter++)

list

C++98,C++11


返回值是删除的迭代器的下一个:An iterator pointing to the element that followed the last element erased by the function call. This is the container endif the operation erased the last element in the sequence.
两种删除方法都可以
iter = map.earse(iter)
map.earse(iter++)

END


PS: 推荐一个在线C++文档查询网站:STL容器查询

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐