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

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 
#include 

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 
#include 

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标准中,以上接口已经做了统一,都可以采用下面这种方式。

你可能感兴趣的:(C++,programming)