C++primer(第五版)9.3.1节,9.3.2节,9.3.3节练习答案



练习9.18:编写程序,从标准输入读取string序列,存入一个deque中。编写一个循环,用迭代器打印deque中的元素。

解答:

#include<iostream>
#include<deque>
#include<string>

using std::string;using std::deque;using std::endl;using std::cin;using std::cout;

int main()
{
	string str;
	deque<string> sde;
	while(cin>>str)
		sde.push_back(str);
	for(auto &s:sde)
		cout<<s<<" ";
	cout<<endl;

	return 0;
}


练习9.19:重写上题的程序,用list代替deque。列出程序要做出哪些改变。

解答:

把deque替换为list即可。

#include<iostream>
#include<list>
#include<string>

using std::string;using std::list;using std::endl;using std::cin;using std::cout;

int main()
{
	string str;
	list<string> sde;
	while(cin>>str)
		sde.push_back(str);
	for(auto &s:sde)
		cout<<s<<" ";
	cout<<endl;

	return 0;
}


练习9.20:编写程序,从一个list<int>拷贝元素到两个deque中。值为偶数的所有元素拷贝到一个deque中,而奇数值元素都拷贝到另一个deque中。

解答:

#include<iostream>
#include<list>
#include<deque>

using std::deque;using std::list;using std::endl;using std::cin;using std::cout;

int main()
{
	list<int> sde{1,2,3,4,5,6};
	deque<int> d1,d2;
	for(const auto &s:sde)
	{
		if(s%2==0)
			d1.push_back(s);	
		else
			d2.push_back(s);
	}
	for(auto &i1:d1)
		cout<<i1<<" ";
	cout<<endl;
	for(auto &i2:d2)
		cout<<i2<<" ";
	cout<<endl;

	return 0;
}


练习9.21:如果我们将第308页中使用insert返回值将元素添加到list中的循环程序改写为将元素插入到vector中,分析循环将如何工作。

解答:

插入第一个读取的字符串,并把它插入到ITER前。返回的值是指向新元素的迭代器;阅读的另一个词。只要有文字的插入,每次通过同时插入一个新的元素在ITER之前,重置iter新插入的元素的位置。该元素是第一个元素(新)。因此,每一次迭代中插入一个元素在为vector中的第一个元素。


练习9.22:假定iv是一个int的vector,下面的程序存在什么错误?你将如何修改?

vector<int>::iterator iter = iv.begin(),mid = iv.begin()+iv.size()/2;

while(iter != mid)

     if(*iter == some_val)

           iv.insert(iter, 2*some_val);

解答
1.这是一个无限的循环,因为iter永远不等于mid;
2。mid在调用insert函数后失效。

修改:

#include<iostream>
#include<vector>
#include<iterator>

using std::iterator;using std::vector;using std::endl;using std::cout;

int main()
{
	vector<int> iv{1,2,3,4,5,6,7,8,9,10};
	iv.reserve(25);

	vector<int>::iterator iter = iv.begin(),
						  mid = iv.begin()+iv.size()/2;
	while(iter!=mid)
		if(*mid == 5)
			mid = iv.insert(iter, 2*5);
		else
			--mid;

	return 0;
}

练习9.23:在本节第一个程序(309页)中,若c.size()为1,则val、val2、val3和val4的值会是什么?
解答:
这四个元素的值与第一个元素的值相等。

练习9.24:编写程序,分别用at、下标运算符、front和begin提取一个vector中的第一个元素。在一个空vector上测试你的程序。
解答:
#include<iostream>
#include<vector>

using std::vector;using std::endl;using std::cout;

int main()
{
	vector<int> iv;    
	cout<<iv.at(0)<<endl;    // terminating with uncaught exception of type std::out_of_range
	cout<<iv[0]<<endl;       // Segmentation fault: 11
	cout<<iv.front()<<endl;  // Segmentation fault: 11
	cout<<*iv.begin()<<endl; // Segmentation fault: 11
	return 0;
}

练习9.25:对于312页中删除一个范围内的元素的程序,如果elem1与elem2相等会发生什么?如果elem2是尾后迭代器,或者elem1和elem2皆为尾后迭代器,又会发生什么?

解答:

如果elem1与elem2相等,什么也不会发生;如果elem2是尾后迭代器,则输出elem1到最后的所有元素;如果elem1和elem2皆为尾后迭代器,什么都不会发生。


练习9.26:使用下面代码定义的ia,将ia拷贝到一个vector和一个list中。使用单迭代版本的erase从list中删除奇数元素,从vector中删除偶数元素。

int iain[] = {0,1,1,2,3,5,8,13,21,55,89};

解答:

#include<iostream>
#include<list>
#include<vector>

using std::list;using std::vector;using std::endl;using std::cout;using std::end;

int main()
{
	int ia[] = {0,1,1,2,3,5,8,13,21,55,89};
	vector<int> ivec(ia,end(ia));
	list<int> ilist(ivec.begin(),ivec.end());

	for(auto it = ilist.begin(); it != ilist.end(); )
		if(*it & 0x1)
			it = ilist.erase(it);
		else
			++it;
	for(auto it = ivec.begin(); it != ivec.end(); )
		if(*it %2 == 0)
			it = ivec.erase(it);
		else
			++it;

	cout<<"list: "<<endl;
	for(auto i:ilist)
		cout<<i<<" ";
	cout<<endl;
	cout<<"vector: "<<endl;
	for(auto i:ivec)
		cout<<i<<" ";
	cout<<endl;

	return 0;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值