//今天写了一些关于使用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++只能放在现在所放的位置,如果变化位置移动到上面的话就会出错,原因可能有些别扭,但是也不难想到,就拿第一个删除//偶数中的第一个与元素为例子来理解!
STL中的erase函数的问题
最新推荐文章于 2024-02-28 16:26:40 发布