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;
} 展开
对了程序功能是删除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;
} 展开
7个回答
展开全部
对于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;
}
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;
}
展开全部
ivec.erase(iter);
这句执行后,iter变成了野指针,无法再执行 ++ 操作了
试着这么写
if(*iter%2==0) {
ivec.erase(iter++);
continue;
}
lter 也是一样的。
这句执行后,iter变成了野指针,无法再执行 ++ 操作了
试着这么写
if(*iter%2==0) {
ivec.erase(iter++);
continue;
}
lter 也是一样的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
ivec.erase(iter); 这个不是erase的问题,而是你用了这个而ivec里面的数据了,所以此时的iter不会起作用了。你可以单步调试看下的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
楼上的都先去好好看看书吧
#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;
}
#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;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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--)
...
{
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--)
...
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询