sometimes,我们需要手写循环(相对于for_each)来erase容器内某些元素,新手经常会犯一些错误。这里总结一下比较常用的固定写法。
删除所有偶数项,并打印出删除的项
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;
}
}
{
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:
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;
}
}