總結本人在工作中經驗教訓。
在使用 list、set 或 map遍歷刪除某些元素時可以這樣使用:
正確使用方法1
std::list< int> List;
std::list< int>::iterator itList;
for( itList = List.begin(); itList != List.end(); )
{
if( WillDelete( *itList) )
{
itList = List.erase( itList);
}
else
itList++;
}
正確使用方法2
std::list< int> List;
std::list< int>::iterator itList;
for( itList = List.begin(); itList != List.end(); )
{
if( WillDelete( *itList) )
{
List.erase(itList++);
}
else
itList++;
}
正確使用方法3
std::list< int> List;
std::list< int>::iterator it, next;
for( it = List.begin(), next = it, next ++; it != List.end(); it = next, ++next)
{
if( WillDelete( *it) )
{
List.erase(it);
}
}
注:方法三更為巧妙,但需注意方法三是用前需要判斷容器是否為空,否則迭代器會出問題。
我測試得出,set.erase 不返回迭代器,list返回。
vector 刪除操作
std::vector <PACK_PRINT>::iterator It ;
for(It=printItems.begin();It!=printItems.end();)
{
//我是說這里怎么判斷printItems printItems 里PACK_PRINT.bh =0
if( It.bh ==0) //是這樣嗎?
{//刪除
It=printItems.erase(It);
}
else
{//不刪除
++It;
}
}
std::vector <PACK_PRINT> printItems;
int i = 0;
while(i < printItems.size())
{
if(printItems[i].bh == 0) //這里比如我想把 printItems 時PACK_PRINT.bh =0 的刪除如何寫喲。另外這樣刪除有錯嗎?
{//刪除
printItems.erase(printItems.begin() + i);
}
else
{//不刪除
++i;
}
}