C++ STL中erase函数的用法 求助~~

请大家来看一下这个erase函数到底怎么用这个程序编译倒是能通过可运行时会显示错误“嘭”一声弹出个对话框DebugAssertionFailed!我觉得肯定是erase函... 请大家来看一下这个erase函数到底怎么用 这个程序编译倒是能通过 可运行时会显示错误 “嘭”一声弹出个对话框Debug Assertion Failed!我觉得肯定是erase函数用法不对 可是找不到错误在哪儿 请大家指导一下了~~~

对了程序功能是删除vector对象中的偶数和list对象中的奇数

#include<iostream>
#include<vector>
#include<list>
using namespace std;
int main()
{
int ia[10]={2,3,4,5,6,7,8,9,10,11};
vector<int> ivec(ia,ia+10); //定义一个vector对象ivec
vector<int>::iterator iter=ivec.begin();
list<int> lvec(ia,ia+10); //定义一个list对象lvec
list<int>::iterator lter=lvec.begin();
while(iter!=ivec.end() && lter!=lvec.end())
{
if(*iter%2==0)
ivec.erase(iter);
if(*lter%2!=0)
lvec.erase(lter);
++iter;
++lter;
}
for(iter=ivec.begin(); iter!=ivec.end(); ++iter)
cout<<*iter<<" ";
cout<<endl;
for(lter=lvec.begin(); lter!=lvec.end(); ++lter)
cout<<*lter<<" ";
cout<<endl;
system("PAUSE");
return 0;
}
展开
 我来答
q嘿仔
推荐于2017-09-01 · TA获得超过2879个赞
知道小有建树答主
回答量:107
采纳率:0%
帮助的人:183万
展开全部
对于vector一般不要用erase(),因为很多情况下他要和<algorithm>中的remove()一块用!erase()的使用会使迭代器失效如果删除的不是最后面的元素的话。你的程序中if(*iter%2==0) ivec.erase(iter); 可以换成:(记着加头文件<algorithm>)

if (*iter%2 == 0)
ivec.erase(remove(ivec.begin(), ivec.end(), *iter), ivec.end())
但如果你用if (*iter%2 != 0)
ivec.erase(remove(ivec.begin(), ivec.end(), *iter), ivec.end())
输出结果则包含11,结果错误!
不知道你为什么数组,向量,链表都用,为了和你一致,我也只能改成这样:
#include <iostream>
#include <vector>
#include <list>
#include <algorithm>
#include <functional>
#include <iterator>
using namespace std;

int main ()
{
vector<int> ivec;
list<int> ilis;

int vec[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11};

remove_copy_if (vec, vec+10, back_inserter(ivec),
bind2nd(modulus<int>(), 2));

remove_copy_if (vec, vec+10, back_inserter(ilis),
not1(bind2nd(modulus<int>(), 2)));

for (vector<int>::const_iterator iter = ivec.begin();
iter != ivec.end(); ++iter)
cout << *iter << '\t';
cout << endl;

for (list<int>::const_iterator liter = ilis.begin();
liter != ilis.end(); ++liter)
cout << *liter << '\t';
cout << endl;
}
最好的做法是:
#include <iostream>
#include <vector>
#include <list>
#include <algorithm>
#include <functional>
#include <iterator>

using namespace std;

int main ()
{
vector<int> ivec, odd_vec, even_vec;

for (int i = 2; i != 12; ++i)
ivec.push_back(i);

remove_copy_if (ivec.begin(), ivec.end(),
back_inserter(even_vec), bind2nd(modulus<int>(), 2));

remove_copy_if (ivec.begin(), ivec.end(),
back_inserter(odd_vec), not1(bind2nd(modulus<int>(), 2)));

copy (even_vec.begin(), even_vec.end(),
ostream_iterator<int>(cout, "\t"));
cout << endl;

copy (odd_vec.begin(), odd_vec.end(),
ostream_iterator<int>(cout, "\t"));
cout << endl;
}
joanlynn
2009-04-27 · TA获得超过298个赞
知道小有建树答主
回答量:253
采纳率:0%
帮助的人:0
展开全部
ivec.erase(iter);
这句执行后,iter变成了野指针,无法再执行 ++ 操作了
试着这么写
if(*iter%2==0) {
ivec.erase(iter++);
continue;
}

lter 也是一样的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
yhw1155
2009-04-27 · 超过27用户采纳过TA的回答
知道答主
回答量:96
采纳率:0%
帮助的人:76.2万
展开全部
ivec.erase(iter); 这个不是erase的问题,而是你用了这个而ivec里面的数据了,所以此时的iter不会起作用了。你可以单步调试看下的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
xrayron
2009-04-27 · TA获得超过1052个赞
知道大有可为答主
回答量:781
采纳率:0%
帮助的人:951万
展开全部
楼上的都先去好好看看书吧

#include<iostream>
#include<vector>
#include<list>
using namespace std;
int main()
{
int ia[10]={2,3,4,5,6,7,8,9,10,11};
vector<int> ivec(ia,ia+10); //定义一个vector对象ivec
vector<int>::iterator iter=ivec.begin();
list<int> lvec(ia,ia+10); //定义一个list对象lvec
list<int>::iterator lter=lvec.begin();
while(iter!=ivec.end() && lter!=lvec.end())
{
//////////////////////////////
//注意,erase之后迭代器返回指向删除元素后一位置的引用
//只有当没有操作的时候才需要后移
//////////////////////////////
if(*iter% 2== 0)
ivec.erase(iter);
else
iter++;
if(*lter %2 != 0)
lvec.erase(lter);
else
lter++;
}
for(iter=ivec.begin(); iter!=ivec.end(); ++iter)
cout<<*iter<<" ";
cout<<endl;
for(lter=lvec.begin(); lter!=lvec.end(); ++lter)
cout<<*lter<<" ";
cout<<endl;
system("PAUSE");
return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
写代码的卖鱼人
2009-04-27 · TA获得超过354个赞
知道小有建树答主
回答量:259
采纳率:100%
帮助的人:252万
展开全部
while(iter!=ivec.end() && lter!=lvec.end())
{
if(*iter%2==0)
ivec.erase(iter);
if(*lter%2!=0)
lvec.erase(lter);
++iter;
++lter;
}

楼主注意:
erase()使所有删除点之后的迭代器失效,但对于删除点上和删除点之前的迭代器没有影响。
所以你++lter有问题。
如果你用反向遍历就会很好的说了:
for (lter = ivec.end(); lter != ivec.begin(); lter--)
...
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(5)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式