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)); }
vector
vv.push_back(1); //加入第一个元素
vector
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
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
{
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.push_back(1); //加入第一个元素
vector
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
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
{
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.reserve(10); //预留10个元素空间
int nn = vn.capacity(); //nn = 10
vn.push_back(1);
vn.push_back(2);
nn = vn.capacity(); //nn = 10
vector
nn = vn.capacity(); //nn = 2
nn = vn.size(); //nn = 2
vector
vector
vn.reserve(10); //预留10个元素空间
int nn = vn.capacity(); //nn = 10vn.push_back(1);
vn.push_back(2);
nn = vn.capacity(); //nn = 10vector
nn = vn.capacity(); //nn = 2
nn = vn.size(); //nn = 2vector
map
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
for(mit = mm.begin(); mit != mm.end();)
{
if(mit->second == 1)
{
mm.erase(mit++); //这里需要注意
}
else
{
mit++;
}
}
//第二种方法,while+find_if+erase
//仅以元素做条件检索
bool mBeDelete(const pair
{
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
{
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)); }
vector、map容器删除操作总结 - shellching的专栏 - CSDN博客
STL之vector的使用 - wxdvc的专栏 - CSDN博客
vector vs deque - Aeolus Zheng的专栏 - CSDN博客
貼圖filtering與MIP map簡介-杨德龙的专栏-CSDN博客
周海汉:标准模板库stl 容器的线程安全 - 周海汉的开发专栏 - CSDN博客
如何删除联想lenovo硬盘的隐藏分区 - prodicom的专栏 - CSDN博客
baozhengw的专栏 - CSDN博客
C#操作xml之xpath语法 - ismycxp的专栏 - CSDN博客
Word操作技巧大全1(转) - kafeiwu2003的专栏 - CSDN博客
Word操作技巧大全1(转) - kafeiwu2003的专栏 - CSDN博客
运用VC或Java对Office进行编程操作 - etre的专栏 - CSDN博客
Android图形架构实现分析总结 - shenbin1430的专栏 - CSDN博客
界面编程总结(1) - 深之JohnChen的专栏 - CSDN博客
MFC控件使用总结——CListCtrl - mlidify的专栏 - CSDN博客
STL容器类 vector,list,deque的比较
AGPS简介 - kv110的专栏 - CSDN博客
OpenMAX简介 - shenbin1430的专栏 - CSDN博客
Android flinger - simmer_ken的专栏 - CSDN博客
windows 命令 - orangeman1982112的专栏 - CSDN博客
JNDI概述 - tanghongru1983的专栏 - CSDN博客
指针 - syhhl007的专栏 - CSDN博客
变量命名 - yszwn的专栏 - CSDN博客
什么是PLL - JasonCao的专栏 - CSDN博客
VC积累 - cherryt的专栏 - CSDN博客