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