天天看點

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,很簡單的問題。

繼續閱讀