C primer第二次閱讀學習筆記(第3章)

2021-06-06 12:50:04 字數 3184 閱讀 1784

第三章

在標頭檔案中應該使用完全限定的標準庫名字,如std::cout<。而不應該使用

using std::cout;

或using namespaces std;

在標頭檔案中放置

using 

宣告,就相當於在包含該標頭檔案的每個程式中都放置了同一

using

宣告。應該在標頭檔案中包含確實需要的東西,遵守最小權原則。

string是定義在

std名字空間的名字。

getline用於讀取整行文字,遇到換行符停止,但不包括換行符。

string成員函式

size

()返回的是

string::size_type

型別。它被稱為配套型別(

companion type

)通過這些配套型別可以實現庫型別的使用與機器無關(

machine independent)

。它被定義為與

unsigned

有相同的含義,可以保證足夠大,能夠儲存任意長度的

string

物件。因此任何儲存

string

的size()返回

結果的變數必須為

string

::size_type

型別,注意不要把

size

的返回結果賦給

int型別的變數。因為在有些機器上

int型別表示範圍很小,如

16位的

int型別的變數最大只能表示

32767

個字元。使用

size_type

時最安全的方法。

string st1=,st2="abcdefg";

st1=st2;

注意此處將一字串直接賦值給st2

,呼叫的是複製建構函式,且單參建構函式執行了隱式轉換。

將string

型別的物件與字串進行混合操作時,如

string s1("abc");string s2=s2+"def";+

左右運算元必須至少有乙個是

string

型別的。如

string s2=s1+" , "+"!!"

;之所以可以這樣級聯操作,是因為 它和

cout

,cin

是一樣的,

s1+","

將返回乙個新的

string

物件。string s3=","+"!!"+s2;

這句是錯的。因為第乙個

+運算子兩邊均是字串,這是不允許的。

前面提到應該用string

::size_type

型別的變數接受

size

的返回值,同樣在定義作用

string

物件的索引變數時最好也用

string

::size_type

型別。vector是乙個類模板,它可以定義任意多種資料型別,但它不是一種資料型別。

vector

是資料型別。

對於vector

儲存內建型別的元素,標準庫將用

0值初始化所有的成員。如

vectorvec(10);10

個int

型別的成員初始值均為

0;如果儲存的是類型別,標準庫將呼叫類的預設建構函式來初始化每乙個元素。如果類中定義了建構函式,但沒有提供預設建構函式,初始化這種型別的

vector

物件時,除了提供

vector

物件所含的元素個數之外,還必須指定每個元素的初始值。

vector的

size

返回相應的

vector

定義的size_type

的值,但

vector::size_type

是不正確的,必須指明該型別是在**定義的,如

vector::size_type;//

正確除了使用下標來訪問vector

物件元素外,還可以使用迭代器來訪問。之所以為所有的標準庫容器都定義了相應的迭代器型別,是因為只有少數的容器支援下表操作。迭代器是通用化的方法。

每種容器都定義了自己的迭代器型別,如vector

::iterator iter

;begin

()返回

vector

的開始元素,

end()返回

vector

末端元素的下乙個,它不指向任何元素。通常被稱為超出末端。若

vector

為空begin()

和end()

返回的迭代器相同。

for(vector::iterator iter=vec.begin();iter!=vec.end();iter++);

對於此句判斷

iter

是否指向

vector

容器的末尾,使用的是

!=符號,而不是常使用的

<

符號。iter++

,是iter

指向容器中的下乙個元素,這與指標類似。另外之所以每次判斷是都呼叫

end(),而不在迴圈開始之前就獲得,是因為迴圈內可能會增加或刪除容器的元素,一旦發生此情況迭代器就會失效,很可能導致死迴圈。

const_interator與

interator

類似,只是它無法改變引用的元素的值,僅僅能讀取。注意c

onst vector::iterator,

此迭代器無法通過自增自減改變指向.僅僅可以改變它指向的元素的值。與

const int *const p

相聯絡可以加深理解 。

iter2-iter1,兩迭代器相減得到兩個迭代器之間元素的個數。容器內定義了

different_type

型別來表示儲存此變數的型別。實際就是

signed

型別。iter1+num

,通過對迭代器增加或減少某個值,讓迭代器直接指向某個元素。如

vector::iterator iter=vec.begin()+vec.size()/2;

直接訪問中間的元素。

再囉嗦一句:任何改變vector

長度的操作都會使已存在的迭代器失效,例如在

push_back

之後就不能在依賴指向

vector

的迭代器的值了。

C primer第二次閱讀學習筆記(第4章)

c 語言應盡量使用 vector 和迭代器型別,應避免使用低階的陣列和指標,涉及良好的程式只有在強調速度時才在類實現的內部使用陣列和指標。因此要向成為乙個真正的 c 程式設計師就要多使用 vector 和string 來替代陣列和 c風格字串。陣列的維數必須用整型常量指定,非const 型別或是到執...

C primer第二次閱讀學習筆記(第5章)

對於兩個數的除法和求模,若均為正,則結果均為正。若均為負,除法結果為正,取模的結果為負。若一正一負,則結果依賴於具體編譯器。之所以不能串聯使用關係操作符如if i,因為關係操作符具有左結合特性。i首先比較,比較的結果為0或 1,然後在與 k進行比較,只要 k 1,結果恒為真。對於判斷與bool 值相...

C primer第二次閱讀學習筆記(第6章)

第六章 在switch 中只有在最後乙個 case 或是default 語句之後才能定義變數,之所以這樣規定是為了避免 跳過變數定義和初始化。如switch val 為了解決這種情況,可以為每個case 語句新增 花括號,引入塊語句,在該塊定義的變數只能在該語句塊中使用。對於do while 迴圈d...