欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

list、vector、map容器erase的区别

程序员文章站 2022-06-16 23:38:48
...

一句话总结:list、vector返回的迭代器,map返回空(C++98标准);注意迭代器不要越界。

map是从模板类继承来的,不同的C++版本标准其erase函数也不同:

C++98

C++11

void erase (iterator position);

iterator erase (const_iterator position);

size_type erase (const key_type& k);

size_type erase (const key_type& k);

void erase (iterator first, iterator last);

iterator erase (const_iterator first, const_iterator last);


list、vector:

iterator erase( iterator _Where);
iterator erase( iterator _First, iterator _Last);
如果是删除指定位置的元素时:
返回值是一个迭代器,指向删除元素下一个元素;如果是删除某范围内的元素时:返回值也表示一个迭代器,指向最后一个删除元素的下一个元素;

typedef list<int>::iterator list_iterator;
list_iterator iter = a.begin();
typedef vector<int>::iterator vector_iterator;
vector_iterator iter = a.begin();
for(;iter!=a.end();)
{
    if((*iter).value == 1)
    {
        iter = a.erase(iter);
    }
    else
    {
        iter++;
    }
}

而对于map,为了兼容标准,能够在任何机器上编译通过,并且能够跨平台(windows、linux)

当在循环体中使用map::erase语句时,

map<int, int> m;
map<int, int>::iterator iter = m.begin();
map<int, int>::iterator iterErase;
while (iter != m.end())
{
    iterErase = iter;
    iter++;
    m.erase(iterErase);
}

也可以:
map<int, int> m;
map<int, int>::iterator iter = m.begin();
while (iter != m.end())
{
    m.erase(iter++);
}
不过这个只适合参数入栈顺序是从右向左的方式,参数入栈顺序是和具体编译器实现相关,

如果不幸遇到参数入栈顺序是从左向右的,上面的写法就不行了。