1. 程式人生 > >C++Primer第五版 第十章習題答案(1~10)

C++Primer第五版 第十章習題答案(1~10)

1:這個比較簡單,類比下 find() 函式也就知道了。

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
void main()
{
	int number = 0;
	int arr[] = { 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	vector<int> arr1;
	for (auto a : arr)
		arr1.push_back(a);
	cout << "there are " << count(arr1.begin(), arr1.end(), number) << " times " << number << endl;
	system("pause");
}

2:同1,類比下就知道了。

#include<iostream>
#include<algorithm>
#include<list>
#include<string>
using namespace std;
void main()
{
	string  example("a");
	string str_a[] = {"a","b","c","d"};
	list<string> str;
	for (auto a : str_a)
		str.push_back(a);
	cout << "there are " << count(str.begin(), str.end(), example) << " times " << example << endl;
	system("pause");
}

3:知識點:

1、accumulate() 在標頭檔案:numeric中。

2、accumulate(vec.cbegin(), vec.cend(), 0):第三個引數要與vec所存元素可加。

#include<iostream>
#include<vector>
#include<numeric>
using namespace std;
void main()
{
	vector<int> arr{ 0, 1, 2, 3, 4, 5 };
	int sum = accumulate(arr.begin(), arr.end(), 0);
	cout << sum << endl;
	system("pause");
}

4:accumulate(v.cbegin(), v.cend(), 0):相加必須進行型別轉換,而v.cbegin() 和 v.cend() 為const。當型別轉化時,v 中元素會損失精度,這與其為 const 的要求衝突。(然而編譯器沒報錯)。

5:string 也是容器,有迭代器的。而單純的 char 陣列不存在迭代器。但可以用容器存 char字元, 比較沒什麼變化。

6:知識點:確保fill_n(vec.begin(), n, num) 中,n的值不能超過容器元素個數。

7:知識點:(兩個都是錯誤的)

1、傳遞給copy 的目的序列至少要包含與輸入序列一樣多的元素。

2、reverse() 改變的是容器容量,並沒有改變其大小,可用resize() 函式。

8:back_inserter 的作用:接受一個指向容器的引用,返回一個與該容器繫結的插入迭代器。只有我們通過此迭代器賦值時,賦值運算子會呼叫容器操作 push_back() 將一個給定元素新增到容器中,而這與插入迭代器無關。

9:知識點: 1、sort(): 按字典排序,把重複的單詞放在一起,以便查詢。                                                                                                            2、unique(): 重排輸入序列,將相鄰的重複項“消除”,並返回一個指向不重複範圍的尾後迭代器。(unique 返回的迭代器指向最後一個不重複元素之後的位置,此位置之後的元素任然存在,但我們不知道他們的值是什麼)                                                        3、標準庫演算法對迭代器而不是容器進行操作。因此,演算法不能(直接)新增或刪除元素。為了真正刪除無用元素,我們必須使用容器操作,本例中使用的是erase(P311)。                                                             

#include<iostream>
#include<string>
#include<vector>
#include<numeric>
#include<algorithm>
using namespace std;
void elimDups(vector<string> &words)
{
	cout << "排序前:" << endl;
	for (auto a : words)
	{
		cout << a << ends;
	}
	sort(words.begin(), words.end());    //sort排序
	cout << "\n按字典序排序:" << endl;
	for (auto b : words)
	{
		cout << b << ends;
	}
	vector<string>::iterator vec = unique(words.begin(), words.end());    //unique排序
	cout << "\n重排輸入範圍:" << endl;
	for (auto c : words)
	{
		cout << c << ends;
	}
	words.erase(vec, words.end());    //erase()操作
	cout << "\n消去重複項:" << endl;
	for (auto d : words)
	{
		cout << d << ends;
	}

}
void main()
{
	vector<string> words{ "a", "b", "b", "a", "c", "b", "c" };
	elimDups(words);
	system("pause");
}

10:演算法基於迭代器來操作以實現泛型,而當需要在容器中新增或刪除元素時, 不知道容器和容器元素的具體型別,就不可能知道需要增加或減少多少空間,就無法實現容器新增或刪除元素的目的。 新增或刪除容器元素的操作是與型別強相關的,而泛型的演算法做不到這點。