C primer習題筆記第7 9章

2021-06-27 16:03:27 字數 3290 閱讀 6933

1、下面的程式雖然是合法的,但可用性還不夠好,指出並改正該程式的侷限。

bool test( string& s)  

【解答】

其侷限在於:此處使用引用形參的唯一目的是避免複製實參,但沒有將形參定義為const引用,從而導致不能使用字串字面值呼叫該函式(因為非const引用形參只能與完全同型別的非const物件關聯)。

可更正為:

bool test ( const string& s)

2、何時應將引用形參定義為const物件?如果在需要const引用時,將形參定義為普通引用,則會出現什麼問題?

【解答】

如果使用引用形參的唯一目的是避免複製實參,則應將引用形參定義為const物件。

如果在需要const引用時,將形參定義為普通引用,則會導致不能使用右值和const物件,以及需要進行型別轉換的物件來呼叫該函式,從而不必要地限制了該函式的使用。

3、什麼時候應使用指標形參?什麼時候應使用引用形參?解釋兩者的優點和缺點?

【解答】

當函式需要處理陣列且函式體不依賴於陣列的長度時應使用指標形參,其他情況下應使用引用形參。

指標形參的優點是可以明確地表示函式所操縱的是指向陣列元素的指標,而不是陣列本身,而且可以使用任意長度的實參陣列來呼叫函式;其缺點是函式體不能依賴於陣列的長度,否則容易造成陣列記憶體的越界訪問,從而產生錯誤的結果或導致程式崩潰。

引用形參的優點是在函式體中依賴陣列的長度是安全的;其缺點是限制了可以傳遞的實參陣列,只能使用長度匹配的實參陣列來呼叫函式。

4、編寫乙個主函式main,使用兩個值作為實參,並輸出它們的和。

【解答】

#include

using namespace std;

int main(int argc , char **argv)

//檢查命令列引數

if( argc != 3 );

listplst;

plst. assign(  c_arr,  c_arr+3 );

vectorstrvec;

strvec. assign(  plst. begin(), plst. end()  );

9、解釋下面程式實現的功能:

vectorsvec;

svec.reserve( 1024 );

string text_word;

while ( cin >> text_word )

svec.push_back(  text_word );

svec.resize( svec.size() + svec.size()/2 );

如果該程式讀入了 256 個單詞,在調整大小後,該容器的容量可能是多少?如果讀入 512,或 1000,或 1048 個單詞呢?

【解答】

功能:將 svec 的 size 設定為 1024,然後從標準輸入裝置讀入一系列單詞,最後將該 vector 物件的大小調整為所讀入單詞個數的 1.5 倍。

當讀入 256 或 512 時,容器的容量不變,仍為 1024,因為容器大小沒有超出已分配記憶體容量。調整大小只改變容器中有效元素的個數,不會改變容量。當讀入 1000 時,最後調整容量時,需要 1500 個元素的儲存空間,超過了已分配的容量 1024,所以可能重新分配為 1536 的容量。當讀入 1048 時,在讀入 1025 個時,容器的容量可能會增長為 1536,最後輸入完 1048 個單詞後,在調整大小後,需要 1572 個元素的儲存空間,超過了已分配的 1536,因此再次重分配,容量再增長 0.5倍,變為 2304。

10、對於下列程式任務,採用哪種容器實現最合適?解釋選擇的理由。

(d)  從乙個檔案中讀入未知數目的整數。對這些整數排序,然後把它們輸出到標準輸出裝置。

【解答】

(d)  如果一邊輸入一邊排序,則採用 list 合適,如果先讀入所有的整數,然後排序,則用 vector 合適,因為進行排序最好有隨機訪問的能力。

11、vectorcvec;

string str(  cvec. begin(), cvec. end() );

12、假設希望一次讀取乙個字元並寫入 string 物件,而且已知需要讀入至少 100 個字元,考慮應該如何提高程式的效能?

【解答】

string 物件中的字元時連續儲存的,為了提高效能,事先應該將物件的容量指定為至少 100 個字元的容量,以避免多次進行記憶體的重新分配。可使用reserve 函式實現。

13、已知有如下 string 物件:

string  line1  =  「  we  were  her  pride  of  10  she  named us:「;

string line2 = 「benjamin, phoenix, the prodigal「;

string line3 = 「and perspicacious  pacific suzanne「;

string sentence = line1 + 『  『   + line2 + 『   『  + line3;

編寫程式計算 sentence 中有多少個單詞,並指出其中最長和最短單詞。如果有多個最長或最短單詞,則將它們全部輸出。

【解答】

#include  "stdafx.h"

#include  

#include  

#include  

using  namespace  std;

int main()

else

else  if (  wordlen  == maxlen )

if  ( wordlen  < minlen  )

else  if (  wordlen  == minlen  )}}

// cout number of words

cout  << "\n\t there are " << cnt << " words in the sentence." << endl;

vector::iterator  iter;

// out the longest word

cout  << "\n\t longest word :"   <<  endl;

iter = longestwords . begin();

while  ( iter != longestwords. end()  )

// out the shortest word

cout  << "\n\t shortest word :"  << endl;

iter = shortestwords. begin();

while  ( iter != shortestwords. end()  )

system("pause");

return 0;

C primer習題筆記第4章

1 解釋下列宣告語句,幵指出哪些是非法的,為什麼?d int ip,ip2 e const int i 0,p i 解答 d 合法。定義了 int 物件 ip2 和指向 int 型物件的指標 ip。e 合法。定義了 const int 型物件 i 和指向 const int 型物件的指標 p,i 初...

C primer 習題筆記第13 15章

1 下面第二個初始化不能編譯。可以從 vector 的定義得出什麼推斷?vectorv1 42 vectorv2 42 解答 若能編譯成功說明,這是個複製初始化,建立 v2 時,首先呼叫接受乙個 int 型形參的 vector 建構函式,建立乙個臨時 vector 物件,然後再呼叫複製建構函式用這個...

C primer習題 第3章

習題 2.11 編寫程式,要求使用者輸入兩個數 底數 base 和指數 exponent 輸出底數的指數次方的結果。include include include using namespace std intmain for int i 1 i exp i result base cout 的 次...