C++ primer 第五版 中文版 9.3.3 节练习
练习 9.25:对于第312页中删除一个范围内的元素的程序,如果elem1与elem2相等会发生什么?如果elem2是尾迭代器,或者elem1和elem2皆为尾迭代器,又会发生什么?
答:
如果elem1与elem2相等会发生什么? 则删除等同于 elem1=slist.erase(elem1) 或者elem1=slist.erase(elem2),跟单迭代器是一样的。
如果elem2是尾迭代器,则删除elem1之后全部元素,返回elem2。
elem1和elem2皆为尾迭代器,则行为为未定义。
练习 9.26:使用下面代码定义的ia,将ia拷贝到一个vector和一个list中。使用单迭代器版本的erase从list中删除奇数元素,从vector中删除偶数元素。
int ia[]={0,1,1,2,3,5,8,21,55,89};
答:
/*
使用下面代码定义的ia,将ia拷贝到一个vector和一个list中。使用单迭代器版本的erase从list中删除奇数元素,
从vector中删除偶数元素。
int ia[]={0,1,1,2,3,5,8,21,55,89};
*/
#include <iostream>
#include <vector>
#include <list>
using std::cout;
using std::endl;
using std::vector;
using std::list;
using std::end;
using std::begin;
int main()
{
int ia[] = { 0, 1, 1, 2, 3, 5, 8, 21, 55, 89 };
vector<int> ivect(begin(ia), end(ia));
list<int> ilist(begin(ia), end(ia));
cout << "删除偶数元素之前的vector容器中的元素为:";
for (const auto &a : ivect)
cout << a << " ";
cout << endl;
cout << "删除奇数元素之前的list容器中的元素为:";
for (const auto &b : ilist)
cout << b << " ";
cout << endl;
auto vit = ivect.begin();
auto lit = ilist.begin();
while (vit != ivect.end())
{
if (*vit % 2)
{
++vit;
}
else
{
vit = ivect.erase(vit);
}
}
cout << "删除偶数元素之后的vector容器中的元素为:";
for (const auto &a : ivect)
cout << a << " ";
cout << endl;
while (lit != ilist.end())
{
if (*lit % 2)
{
lit = ilist.erase(lit);
}
else
{
++lit;
}
}
cout << "删除奇数元素之后的list容器中的元素为:";
for (const auto &b : ilist)
cout << b << " ";
cout << endl;
return 0;
}
304




被折叠的 条评论
为什么被折叠?



