練習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嗎?解答 從定義上來說,這個是不可能的。練...