c++ primer課後題答案 第9章 : 順序容器

練習9.1 對於下面的程序任務,vector、deque和list哪種容器最爲適合?解釋你的選擇的理由。如果沒有哪一種容器優於其他容器,也請解釋理由。
(a) 讀取固定數量的單詞,將它們按字典序插入到容器中。我們將在下一章中看到,關聯容器更適合這個問題。
(b) 讀取未知數量的單詞,總是將單詞插入到末尾。刪除操作在頭部進行。
(c) 從一個文件讀取未知數量的整數。將這些數排序,然後將它們打印到標準輸出。
解: (a) list ,因爲需要頻繁的插入操作。
(b) deque ,總是在頭尾進行插入、刪除操作。
(c) vector ,不需要進行插入刪除操作。

練習9.2 定義一個list對象,其元素類型是int的deque。
解: std::list<std::deque<int>> l;

練習9.3 構成迭代器範圍的迭代器有何限制?
解: 兩個迭代器 begin 和 end需滿足以下條件: 它們指向同一個容器中的元素,或者是容器最後一個元素之後的位置。
我們可以通過反覆遞增begin來到達end。換句話說,end 不在begin之前。

 練習9.4 編寫函數,接受一對指向vector<int>的迭代器和一個int值。在兩個迭代器指定的範圍中查找給定的值,返回一個布爾值來指出是否找到。

bool find(vector<int>::const_iterator begin, vector<int>::const_iterator end, int i)
{
	while (begin++ != end)
	{
		if (*begin == i) 
			return true;
    }	
    return false;
}

練習9.5 重寫上一題的函數,返回一個迭代器指向找到的元素。注意,程序必須處理未找到給定值的情況。

vector<int>::const_iterator find(vector<int>::const_iterator begin, vector<int>::const_iterator end, int i)
{
	while (begin != end)
	{
		if (*begin == i) 
			return begin;
		++begin;
    }	
    return end;
}

 練習9.6 下面的程序有何錯誤?你應該如何修改它?

list<int> lst1;
list<int>::iterator iter1 = lst1.begin(),
					iter2 = lst1.end();
while (iter1 < iter2) /* ... */
解:
修改成如下:
while (iter1 != iter2)

練習9.7 爲了索引int的vector中的元素,應該使用什麼類型?

vector<int>::size_type

練習9.8 爲了讀取string的list中的元素,應該使用什麼類型?如果寫入list,又應該使用什麼類型?
解:

list<string>::const_iterator // 讀 list

<string>::iterator // 寫

 

練習9.9 begin和cbegin兩個函數有什麼不同?
解: begin 返回的是普通迭代器,cbegin 返回的是常量迭代器。

練習9.10 下面4個對象分別是什麼類型?

vector<int> v1;
const vector<int> v2;
auto it1 = v1.begin(), it2 = v2.begin();
auto it3 = v1.cbegin(), it4 = v2.cbegin();
解:
it1 是 vector<int>::iterator
it2,it3 和 it4 是 vector<int>::const_iterator

練習9.11 對6種創建和初始化vector對象的方法,每一種都給出一個實例。解釋每個vector包含什麼值。

vector<int> vec;    // 0
vector<int> vec(10);    // 10個0
vector<int> vec(10, 1);  // 10個1
vector<int> vec{ 1, 2, 3, 4, 5 }; // 1, 2, 3, 4, 5
vector<int> vec(other_vec); // 拷貝 other_vec 的元素
vector<int> vec(other_vec.begin(), other_vec.end()); // 拷貝 other_vec 的元素

 練習9.12 對於接受一個容器創建其拷貝的構造函數,和接受兩個迭代器創建拷貝的構造函數,解釋它們的不同。
解: 接受一個容器創建其拷貝的構造函數,必須容器類型和元素類型都相同。
接受兩個迭代器創建拷貝的構造函數,只需要元素的類型能夠相互轉換,容器類型和元素類型可以不同。

練習9.13 如何從一個list<int>初始化一個vector<double>?從一個vector<int>又該如何創建?編寫代碼驗證你的答案。

list<int> ilst(5, 4);
vector<int> ivc(5, 5);

vector<double> dvc(ilst.begin(), ilst.end());
vector<double> dvc2(ivc.begin(), ivc.end());

練習9.15 編寫程序,判定兩個vector<int>是否相等。

    std::vector<int> vec1{ 1, 2, 3, 4, 5 };
    std::vector<int> vec2{ 1, 2, 3, 4, 5 };
    std::vector<int> vec3{ 1, 2, 3, 4 };

    std::cout << (vec1 == vec2 ? "true" : "false") << std::endl;
    std::cout << (vec1 == vec3 ? "true" : "false") << std::endl;

練習9.16 重寫上一題的程序,比較一個list中的元素和一個vector中的元素。

    std::list<int>      li{ 1, 2, 3, 4, 5 };
    std::vector<int>    vec2{ 1, 2, 3, 4, 5 };
    std::vector<int>    vec3{ 1, 2, 3, 4 };

    std::cout << (std::vector<int>(li.begin(), li.end()) == vec2 ? "true" : "false") << std::endl;
    std::cout << (std::vector<int>(li.begin(), li.end()) == vec3 ? "true" : "false") << std::endl;

練習9.18 編寫程序,從標準輸入讀取string序列,存入一個deque中。編寫一個循環,用迭代器打印deque中的元素。

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

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

int main()
{
    deque<string> input;
    for (string str; cin >> str; input.push_back(str));
    for (auto iter = input.cbegin(); iter != input.cend(); ++iter)
        cout << *iter << endl;

    return 0;
}

練習9.35 解釋一個vector的capacity和size有何區別。
解: capacity的值表明,在不重新分配內存空間的情況下,容器可以保存多少元素 而size的值是指容器已經保存的元素的數量

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章