zl程序教程

您现在的位置是:首页 >  前端

当前栏目

stl容器set,map,vector之erase用法与返回值详细解析

setMap容器 解析 详细 用法 STL 返回值
2023-06-13 09:15:05 时间

总结本人在工作中经验教训。

在使用list、set或map遍历删除某些元素时可以这样使用:

正确使用方法1

复制代码代码如下:

     std::list<int>List;
     std::list<int>::iteratoritList;
     for(itList=List.begin();itList!=List.end();)
     {
           if(WillDelete(*itList))
           {
              itList=List.erase(itList);
           }
           else
              itList++;
     }

正确使用方法2 
复制代码代码如下:

   std::list<int>List;
     std::list<int>::iteratoritList;
     for(itList=List.begin();itList!=List.end();)
     {
           if(WillDelete(*itList))
           {
              List.erase(itList++);
           }
           else
              itList++;
     }

正确使用方法3
复制代码代码如下:
     std::list<int>List;
     std::list<int>::iteratorit,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>::iteratorIt;
for(It=printItems.begin();It!=printItems.end();)
{
 //我是说这里怎么判断printItemsprintItems里PACK_PRINT.bh=0

 if(It.bh==0)//是这样吗?
 {//删除
      It=printItems.erase(It);
 }
 else
 {//不删除
      ++It;
 }
}


复制代码代码如下:
std::vector<PACK_PRINT>printItems;
inti=0;
while(i<printItems.size())
{

         if(printItems[i].bh==0) //这里比如我想把printItems时PACK_PRINT.bh=0的删除如何写哟。另外这样删除有错吗?
         {//删除
               printItems.erase(printItems.begin()+i);
         }
         else
         {//不删除
               ++i;
         }
}