std::set, std::list, std::vector在erase的区别

来源:互联网 发布:阿里云深圳机房速度 编辑:程序博客网 时间:2024/04/23 21:41

erase函数接口原型

1. std::list::erase

// c++98:iterator erase (iterator position);iterator erase (iterator first, iterator last);//c++11:iterator erase (const_iterator position);iterator erase (const_iterator first, const_iterator last);// 返回值:指向被删除元素的下一个元素的迭代器.如果删除的是最后一个元素,则指向end.

2. std::vector::erase

// c++98:iterator erase (iterator position);iterator erase (iterator first, iterator last);//c++11:iterator erase (const_iterator position);iterator erase (const_iterator first, const_iterator last);// 返回值:指向被删除元素的下一个元素的迭代器.如果删除的是最后一个元素,则指向end.

3. std::set::erase

// c++98:(1) void erase (iterator position);(2) size_type erase (const value_type& val);(3) void erase (iterator first, iterator last);// 注意:无返回值!//c++11:(1) iterator  erase (const_iterator position);(2) size_type erase (const value_type& val);(3) iterator  erase (const_iterator first, const_iterator last);// 返回值:指向被删除元素的下一个元素的迭代器.如果删除的是最后一个元素,则指向end.

erase在遍历时的使用

在c++98标准中,std::set和std::list可采用如下方式:

/** * 仅适用于std::set */#include <iostream>#include <set>int main(){    std::set<int> test;    for (int i = 0;i < 10; ++i) test.insert(i);    std::set<int>::iterator it = test.begin();    while ( it != test.end())    {        if ( *it == 2 || *it == 3)        {            test.erase(it++);        }        else it++;    }    return 0;}

而std::vector和std::list可用如下方式:

/** * 适用于std::vector和std::list */#include <iostream>#include <vector>int main(){    std::vector<int> test;    for (int i = 0;i < 10; ++i) test.push_back(i);    std::vector<int>::iterator it = test.begin();    while ( it != test.end())    {        if ( *it == 2 || *it == 3)        {            it = test.erase(it);        }        else it++;    }    return 0;}

也就是说,std::set仅能用第一种遍历方式,std::vector只能用第二种,而std::list两种都可以。
在c++11标准中,以上接口已经做了统一,都可以采用下面这种方式。