sometimes,我們需要手寫循環(相對于for_each)來erase容器內某些元素,新手經常會犯一些錯誤。這里總結一下比較常用的固定寫法。
刪除所有偶數項,并打印出刪除的項
1. vector/queue
正確方法1:
由于方法2是逆向刪除,效率較高,推薦!
2.map/list
正確方法
刪除所有偶數項,并打印出刪除的項
1. vector/queue
正確方法1:
void?erase(vector<int>?&v)
{
????for(vector<int>::iterator?vi=v.begin();vi!=v.end();)
????{
????????if(*vi?%?2?==?0)
????????{
????????????cout?<<?"Erasing?"?<<?*vi?<<?endl;
????????????vi?=?v.erase(vi);
????????}
????????else?++vi;
????}
}
正確方法2:{
????for(vector<int>::iterator?vi=v.begin();vi!=v.end();)
????{
????????if(*vi?%?2?==?0)
????????{
????????????cout?<<?"Erasing?"?<<?*vi?<<?endl;
????????????vi?=?v.erase(vi);
????????}
????????else?++vi;
????}
}
void?erase2(vector<int>?&v)
{
????for(vector<int>::reverse_iterator?ri=v.rbegin();ri!=v.rend();)
????{
????????if(*ri?%?2?==?0)
????????{
????????????cout?<<?"Erasing?"?<<?*ri?<<?endl;
????????????v.erase((++ri).base());
????????}
????????else?++ri;
????}
}
{
????for(vector<int>::reverse_iterator?ri=v.rbegin();ri!=v.rend();)
????{
????????if(*ri?%?2?==?0)
????????{
????????????cout?<<?"Erasing?"?<<?*ri?<<?endl;
????????????v.erase((++ri).base());
????????}
????????else?++ri;
????}
}
由于方法2是逆向刪除,效率較高,推薦!
2.map/list
正確方法
void?erase(map<int,int>?&m)
{
????for(map<int,int>::iterator?mi=m.begin();mi!=m.end();)
????{
????????if(mi->second?%?2?==?0)
????????{
????????????cout?<<?"Erasing?"?<<?mi->second?<<?endl;
????????????m.erase(mi++);
????????}
????????else?++mi;
????}
}
{
????for(map<int,int>::iterator?mi=m.begin();mi!=m.end();)
????{
????????if(mi->second?%?2?==?0)
????????{
????????????cout?<<?"Erasing?"?<<?mi->second?<<?endl;
????????????m.erase(mi++);
????????}
????????else?++mi;
????}
}