第九章 9 3 6節練習

2021-06-23 08:19:36 字數 1547 閱讀 5371

練習9.31:

第316也中刪除偶數值的元素並複製技術值元素的程式不能用於list或forward_list。為什麼?修改程式,使之也能用於這些型別。

解答:首先,316頁中的程式主要做的是插入和刪除操作,這個操作對於鍊錶容器來說不影響其迭代器和指標。

不過,插入和刪除操作會讓其他容器的迭代器指標失效。

所以,這裡對迭代器所做的處理,就不適合於鍊錶容器了。

這裡對forward_list的處理稍稍需要些耐心。

#include #include #include #include using namespace std;

void vector_func(vector& iv)

else }}

void list_func(list& il)

else }}

void forward_list_func(forward_list& ifl)

else }}

int main();

listilist(vi.begin(), vi.end());

forward_listforward_ilist(vi.begin(), vi.end());

vector_func(vi);

for (auto i : vi)

cout << endl;

list_func(ilist);

for (auto i : ilist)

cout << endl;

forward_list_func(forward_ilist);

for (auto i : forward_ilist)

cout << endl;

}

練習9.32:

在第316頁的程式中,想下面語句這樣呼叫insert是否合法?如果不合法,為什麼?

iter = vi.insert(iter, *iter++)

解答:在這個程式中,這樣做不合法。會產生迭代器訪問越界。

如果要這樣改,下面一句

iter += 2;  --> ++iter;
這樣做才合法,不會出現越界的情況。

練習9.33:

在本節最後乙個例子中,如果不講insert的結果賦予begin,將會發生什麼?編寫程式,去掉此賦值語句,驗證你的答案。

解答:程式會出錯。在容器使用insert以後,迭代器會失效。第二個begin的自加會出錯。

練習9.34:

假定vi是乙個儲存int的容器,其中有偶數值也有奇數值,分析下面迴圈的行為,然後編寫程式驗證你的分析是否正確。

iter = vi.begin();

while(iter != vi.end())

if (*iter % 2)

iter = vi.insert(iter, *iter);

++iter;

解答:不斷往第乙個奇數後面新增相同的奇數,直到記憶體耗盡。

所以,這個程式會產生死迴圈。

第九章 9 2 1節練習

練習 9.3 構成迭代器範圍的迭代器有何限制?解答 這裡首先要清楚什麼是迭代器範圍 引用 乙個迭代器範圍 iterator range 由一對迭代器表示,兩個迭代器分別指向同乙個容器中的元素或者是尾元素之後的位置 one past the last element 再去 限制 引用 對構成範圍迭代器...

第九章 9 2 7節練習

練習 9.15 編寫程式,判定兩個vector是否相等。解答 include include using namespace std int main vectoriv1 iv o.begin iv o.end vectoriv2 iv o.begin 1,iv o.end cout iv o iv...

第九章 9 4節練習

練習9.35 解釋乙個vector的capacity和size有何區別。解答 引用 容器的size是指它已經儲存的元素數目 而capactiy則是在不分配新的記憶體空間的前提下最多可以儲存多少元素。練習9.36 乙個容器的capacity可能小於他的size嗎?解答 從定義上來說,這個是不可能的。練...