天天看点

C++ primer 第五版 中文版 9.3.3 节练习

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;
}
           

继续阅读