天天看点

C++Primer第五版 第三章习题答案(21~30)

3.21

了解下begin()函数和end()函数的意义,就会迭代了吧,很简单的。

3.22

嗨呀,好气啊,C++11中的新特性cbegin()和cend()函数——指向容器的第一个元素和最后一个元素的下一个位置,都用不了。如果要使用迭代器的话,做不出来的。

3.23

#include <iostream>
#include <string>
#include <vector>
using namespace std;
void main()
{	
	vector<int> text(10,5);
	for (auto it = text.begin(); it != text.end();it++) //注意判断其是否为空
	{
		*it = *it * 2;
		cout<<*it<<endl;	
	}
} 
           

比较简单的题。 

3.24

#include <iostream>
#include <string>
#include <vector>
using namespace std;
void main()
{	
	vector<int> text(10);
	for (int i = 0; i < 10;i++)
	{
		cin>>text[i];
	}
	for (auto vector_begin = text.begin(), vector_end = text.end();vector_begin != vector_end;vector_begin++) 
	{
		vector_end--;
		cout<<*vector_begin + *vector_end<<endl;	
	}
} 
           

注意end()函数指的是最后一个元素的后一个位置,而不是最后一个元素!!!

3.25

这题主要考察迭代器的相关知识

迭代器加减一个整数仍然会得到一个迭代器

要对迭代器本身的元素进行操作需要使用复合语句  += 或者 -=,或者对迭代器进行取值使用*,再进行操作。

#include <iostream>
#include <string>
#include <vector>
using namespace std;
void main()
{	
	vector<int> grade(10,0);
	int number;
	while (cin >> number)
	{
		if (number > 100)
		{
			cout<<"The inupt number is wrong"<<endl;
			break;
		}//超过100报错
		auto it = grade.begin(); //迭代器指向第一个元素
		int n = number/10;//判断分数所属的等级
		it = it + n; //找到所属变量
		++(*it); //执行加1操作
	}
	for(int i = 0;i<10;i++)
	{
		cout<<i*10<<"~"<<i*10+10<<"  ";
		cout<<grade[i]<<endl;
	}//输出分数的等级及相应个数	
} 
           

3.26

因为end指的是最后一个元素的后一个位置!!!(vectoer迭代器的性质要记清楚啦)

3.27

理解复杂数组的声明(难点)

不可以将数组的内容拷贝给其他数组当作初始值,也不能用数组为其他数组赋值。

int  a[3] = {0,1,3};
int a1[]  = a;  //错误
a2 = a; //错误
           

复杂数组声明的理解

int *a[10];  //a数组含有10个指针整形
int &a[10];  //错误,不存在引用的数组
int (*a)[10]; //a是一个指针,指向一个含有10个整数的数组
int (&a)[10]; //a是一个引用,引用一个含有10个整数的数组
int *(&a)[10]; // a是数组的引用,数组含有十个指针
           

理解方法:从数组的名字开始,由内向外顺序读取,先左后右,左边为类型。

3.28

string不是内置的数据类型,int是

sa数组为空。

ia数组含有10个整数,皆为0。

sa2数组为空。

ia2数组含有10个整数,在函数体内,值不确定。

3.29

数组的缺点:数组的大小是确定不变的,不可以向数组中添加元素,丧失了vectoer的灵活性。

3.30

数组大小为10,那么索引应该是0~9,很简单的问题。

继续阅读