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

2025-04-05 14:41:27
推荐回答(1个)
回答1:

对于vector一般不要用erase(),因为很多情况下他要和中的remove()一块用!erase()的使用会使迭代器失效如果删除的不是最后面的元素的话。你的程序中if(*iter%2==0) ivec.erase(iter); 可以换成:(记着加头文件

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
#include
#include
#include
#include
#include
using namespace std;

int main ()
{
vector ivec;
list ilis;

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

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

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

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

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

using namespace std;

int main ()
{
vector 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(), 2));

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

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

copy (odd_vec.begin(), odd_vec.end(),
ostream_iterator(cout, "\t"));
cout << endl;
}