vector、map容器删除操作总结 - shellching的专栏 - CSDN博客

来源:百度文库 编辑:神马文学网 时间:2024/04/28 04:08:52
1、关于vector中元素的删除和迭代器失效问题view plaincopy to clipboardprint?
vector vv;  
vv.push_back(1);                                //加入第一个元素  
vector::iterator itBegin = vv.begin();   //获取第一个元素迭代器*itBegin=1  
vv.push_back(2);                                //因为预留不够,所以发生内存搬移,之前迭代器将全部失效  
vv.push_back(1);                                //即是说itBegin现在已经是个无效迭代器  
vv.push_back(1);                                //所以使用vector迭代器一定要小心失效!  
vv.push_back(3);                                //移动、增加、插入、删除以及reserve、resize都可能使迭代器无效!  
vv.push_back(4);  
vv.push_back(3);  
vv.push_back(5);  
vv.push_back(6);  
int n = vv.size();      //n = 9  
 
vector::iterator itrmv = remove(vv.begin(), vv.end(), 3);    //结果:1,2,1,1,4,5,6,5,6  
n = vv.size();          //n = 9  
 
//删除vector中等于某值的所有元素  
//remove算法只是对容器中有效元素向前移动覆盖无效元素,返回第一个无效元素指针  
//1、它不会有删除动作 2、尾部无效元素没有意义 3、之后容器size不变  
 
vv.erase(itrmv, vv.end());          //结果:1,2,1,1,4,5,6  
n = vv.size();                      //n = 7  
 
bool BeDelete(int n)  
{  
    return n == 1 || n == 2;  
}  
 
//借助remove_if算法删除vecotr中符合某些条件的所有元素  
 
vv.erase(remove_if(vv.begin(), vv.end(), BeDelete), vv.end());  //结果:4,5,6  
n = vv.size();      //n = 3  
 
//若用循环实现删除,需要注意erase后迭代器失效问题  
for(vector::iterator it=vv.begin(); it!=vv.end(); )  
{  
    if(*it == 4)  
    {  
        /*错误的做法 
            vv.erase(it);   //对vector进行增加删除等操作后之前it可能无效 
            it++;           //it此时已经无效 
        */ 
        /*错误的做法 
            vv.erase(it++); //erase后元素发生了移动所以it多向后跳过一个元素 
        */ 
        it = vv.erase(it);  //正确的做法,erase返回下一个有效it  
    }  
    else 
    {  
        it++;  
    }  
}  
 
n = vv.size();              //n=2,结果:5,6 
vector vv;
vv.push_back(1);        //加入第一个元素
vector::iterator itBegin = vv.begin(); //获取第一个元素迭代器*itBegin=1
vv.push_back(2);        //因为预留不够,所以发生内存搬移,之前迭代器将全部失效
vv.push_back(1);        //即是说itBegin现在已经是个无效迭代器
vv.push_back(1);        //所以使用vector迭代器一定要小心失效!
vv.push_back(3);        //移动、增加、插入、删除以及reserve、resize都可能使迭代器无效!
vv.push_back(4);
vv.push_back(3);
vv.push_back(5);
vv.push_back(6);
int n = vv.size();  //n = 9vector::iterator itrmv = remove(vv.begin(), vv.end(), 3); //结果:1,2,1,1,4,5,6,5,6
n = vv.size();   //n = 9//删除vector中等于某值的所有元素
//remove算法只是对容器中有效元素向前移动覆盖无效元素,返回第一个无效元素指针
//1、它不会有删除动作 2、尾部无效元素没有意义 3、之后容器size不变vv.erase(itrmv, vv.end());   //结果:1,2,1,1,4,5,6
n = vv.size();      //n = 7bool BeDelete(int n)
{
 return n == 1 || n == 2;
}//借助remove_if算法删除vecotr中符合某些条件的所有元素vv.erase(remove_if(vv.begin(), vv.end(), BeDelete), vv.end()); //结果:4,5,6
n = vv.size();  //n = 3//若用循环实现删除,需要注意erase后迭代器失效问题
for(vector::iterator it=vv.begin(); it!=vv.end(); )
{
 if(*it == 4)
 {
  /*错误的做法
   vv.erase(it); //对vector进行增加删除等操作后之前it可能无效
   it++;   //it此时已经无效
  */
  /*错误的做法
   vv.erase(it++); //erase后元素发生了移动所以it多向后跳过一个元素
  */
  it = vv.erase(it); //正确的做法,erase返回下一个有效it
 }
 else
 {
  it++;
 }
}n = vv.size();    //n=2,结果:5,6  2、释放vector容器多余的内存view plaincopy to clipboardprint?
vector vn;  
vn.reserve(10);             //预留10个元素空间  
int nn = vn.capacity();     //nn = 10  
 
vn.push_back(1);  
vn.push_back(2);  
nn = vn.capacity();         //nn = 10  
 
vector(vn).swap(vn); //通过建立一个新对象释放多余空间  
nn = vn.capacity();         //nn = 2  
nn = vn.size();             //nn = 2  
 
vector().swap(vn);   //会完全清空容器,释放所有空间 
vector vn;
vn.reserve(10);    //预留10个元素空间
int nn = vn.capacity();  //nn = 10vn.push_back(1);
vn.push_back(2);
nn = vn.capacity();   //nn = 10vector(vn).swap(vn); //通过建立一个新对象释放多余空间
nn = vn.capacity();   //nn = 2
nn = vn.size();    //nn = 2vector().swap(vn); //会完全清空容器,释放所有空间 3、map中删除满足某些条件的元素view plaincopy to clipboardprint?
map mm;  
mm.insert(make_pair(1,1));  
mm.insert(make_pair(2,2));  
mm.insert(make_pair(3,1));  
mm.insert(make_pair(4,3));  
mm.insert(make_pair(5,3));  
mm.insert(make_pair(6,6));  
 
//注意:对map和set等自动排序的容器不应使用remove一类算法  
//应使用for+erase或者while+find_if+erase  
 
 
//第一种方法for+erase  
map::iterator mit;  
 
for(mit = mm.begin(); mit != mm.end();)  
{  
    if(mit->second == 1)  
    {  
        mm.erase(mit++);    //这里需要注意  
    }  
    else 
    {  
        mit++;  
    }  
}                     
 
//第二种方法,while+find_if+erase  
 
//仅以元素做条件检索  
bool mBeDelete(const pair& val)  
{  
    return val.second == 1;  
}  
 
mit = find_if(mm.begin(), mm.end(), mBeDelete);  
while(mit != mm.end())  
{  
    mit = find_if(mm.erase(mit), mm.end(), mBeDelete);  
}  
 
//除元素外还需要传入另外一个条件参数  
 
//这里的参数无法使用常量引用  
bool mBeDelete2(pair val, int n)  
{  
    return val.second == n;  
}  
 
mit = find_if(mm.begin(), mm.end(), bind2nd(ptr_fun(mBeDelete2),3));  
while(mit != mm.end())  
{  
    mit = find_if(mm.erase(mit), mm.end(), bind2nd(ptr_fun(mBeDelete2),3));    }