STL中的erase函数的问题

 //今天写了一些关于使用erase程序,感觉有一些需要注意的地方,下面是所要做的题目:
 //Exercise
 // 9.26:假设有如下 ia 的定义,将 ia 复制到一个 vector 容器和一个 list 容器中。使用单个迭代器参数版本的 erase函数将 list 容器中的奇数值元素删除掉,然后将v //ector 容器中的偶数值元素删除掉。int ia[] = { 0, 1, 1, 2, 3, 5, 8, 13, 21, 55,89 };
   下面是源程序,有两个版本:

//版本一: 
  
       
#include <iostream>
#include <vector>
#include <list>
using namespace std;


int main()
{
  int ia[11]={0,1,1,2,3,5,8,13,21,55,89};
  vector<int> ivec(ia,ia+11);
  list<int> ilist(ia,ia+11);
  vector<int>::iterator first=ivec.begin();
  list<int>::iterator first_list=ilist.begin();
  while(first!=ivec.end())
  { if(*first%2==0)
   {
     first=ivec.erase(first);//如果没有赋值,则在删除first这个元素后,first已经失效。
     continue;
   }
    else
   cout<<*first<<" ";
   ++first;
  }
  cout<<endl;
  while(first_list!=ilist.end())
 {
   if(*first_list%2!=0)
  {
    first_list=ilist.erase(first_list);
    continue;
   }
   else
   cout<<*first_list<<" "; 
  ++first_list;
 }
 cout<<endl;
}
//第二个版本:
#include <iostream>
#include <vector>
#include <list>
using namespace std;


int main()
{
  int ia[11]={0,1,1,2,3,5,8,13,21,55,89};
  vector<int> ivec(ia,ia+11);
   while(first!=ivec.end())  //first++不可以放在这里
 {
   if(*first%2==0)  // ++first 也不可以放在这里!
   {
     first=ivec.erase(first);
      --first;
   }
   ++first;  // 这条语句只能放在这里
 }
 first=ivec.begin();
 while(first!=ivec.end())
 cout<<*first++<<" ";
 cout<<endl;
while(first_list!=ilist.end())
{
  if(*first_list%2!=0)
  {
    first_list=ilist.erase(first_list);
    --first_list;
  }
 ++first_list;
}
first_list=ilist.begin();
while(first_list!=ilist.end())
cout<<*first_list++<<" ";
 cout<<endl;list<int> ilist(ia,ia+11);
  vector<int>::iterator first=ivec.begin();
  list<int>::iterator first_list=ilist.begin();
}          
//备注:其中第二个半分的first++与first_ilist++只能放在现在所放的位置,如果变化位置移动到上面的话就会出错,原因可能有些别扭,但是也不难想到,就拿第一个删除//偶数中的第一个与元素为例子来理解!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值