C Primer 學習筆記(二) 標準庫型別

2021-06-07 12:54:08 字數 4121 閱讀 2050

一、命名空間的using指示與using宣告

1、using宣告

(1)乙個using宣告一次只引入乙個命名空間成員。

(2)using宣告的作用域為:從using宣告點開始,直到包含該using宣告的作用域的末尾,名字都是可見的。類作用域中的using宣告侷限於被定義類的基類中定義的名字。

using std::string;

using std::vector;

2、using指示(待續)

(1)using指示使得特定命名空間的所有名字可見,沒有限制。

(2)可以嘗試使用using指示編寫程式,但在使用多個庫的時候,這樣做會重新引入名字衝突的所有問題。因此,使用using指示應有所限制。

3、除了在函式或其他作用域內部,標頭檔案不應該包含using宣告或using指示。在頂級作用域包含using指示或using宣告的標頭檔案,具有將該名字注入所有包含該標頭檔案的檔案中的效果。在標頭檔案中,最好總是使用完全限定的標準庫名字,比如 std::cout 等。

注:標頭檔案中應該只定義確實必要的東西。

二、標準庫string型別

1、string物件的定義和初始化

(1)string標準庫的預設建構函式將string物件初始化為空串。

(2)程式設計時要注意區分字串字面值和string資料型別的使用。

2、string物件的讀寫

(1)可以用iostream和string標準庫,使用標準輸入輸出操作符來讀寫string物件。

cin操作符會讀取並忽略開頭所有的空白字元(空格、換行、製表符等);並讀取字元直至再次遇到空白字元,讀取終止。

int main()

(2)用getline讀取整行文字

此函式接受兩個引數:乙個輸入流物件和乙個string物件。將讀取的內容儲存到string物件,但不包括換行符。getline不忽略開頭的換行符,即便它是輸入的第乙個字元,geline也將停止讀入並返回。

int main()

3、string物件的操作

(1)string::size_type型別

這是string類型別的配套型別,通過這些型別,庫型別的使用就與機器無關。儲存string的size操作結果的變數必須為string::size_type型別。注意,不要把size的返回結果賦給乙個int變數。

string物件支援下標操作,string物件的索引變數最好也用string::size_type型別。

(2)string物件與字串字面值的連線

當進行string物件和字串字面值混合連線操作時,+操作符的左右運算元必須至少有乙個是string型別的。

string s1 = "hello";

string s2 = s1 + ", " + "world"; //ok

string s3 = "hello" + ", " + "world"; //error

對於s2和s3,依次來看每個子表示式。子表示式s1 + ", "將返回乙個新string物件。

三、標準庫vector型別

vector不是一種資料型別,而只是乙個類模板。vector和vector都是資料型別。

1、vector的定義和初始化

(1)vector物件(以及其他標準庫容器物件)的重要屬性就在於可以在執行時高效的新增元素。因此,雖然可以對給定元素個數的vector物件預先分配記憶體,但更有效的方法是先初始化乙個空vector物件,然後再動態地增加元素。

(2)若沒有指定vector中元素的初始化式,則標準庫將自行提供乙個元素初始化值進行值初始化。此值依賴於元素的資料型別。

2、vector物件的操作

(1)vector物件的下標操作。vector物件支援下標操作。但應注意:下標僅能用於獲取已經存在的元素,且通過下標操作進行賦值時,不會新增任何元素。

(2)關於vector的for迴圈常常寫成如下形式:

for(vector::size_type ix = 0; ix != ivec.size(); ++ix)

ivec[ix] = 0;

應注意兩點:

第一,優先選用 != 而不是 < 來編寫迴圈判斷條件(但當迴圈變數的步長大於1時,則應使用< 。否則可能出現無限迴圈的情況)。

第二,呼叫size成員函式而不提前儲存它返回的值,這是乙個良好的程式設計習慣。這是因為,c++中有些資料結構(比如vector)可以動態增長,迴圈可以很容易的增加新的元素。這樣的執行代價其實很小,因為像size這樣的小庫函式幾乎都定義為內聯函式。

(3)不能用cout輸出操作符直接輸出vector物件。

四、標準庫bitset型別

1、bitset物件的定義和初始化

(1)與vector類似,bitset類也是類模板。不同bitset物件的區別在於長度而不是類別。定義bitset時,需明確指出bitset含有多少位,且給出的長度必須是常量表示式。

(2)用string物件初始化bitset物件。string物件與bitset物件之間是反向轉化的。string物件最右邊字元(下標最大)用來初始化bitset物件的低階位(下標為0)。

2、bitset物件的操作

(1)bitset物件支援下標操作。但是,bitset物件的下標編號從右向左,最右邊編號為0;而string物件的下標編號從左向右,最左邊編號為0。

(2)可用cout輸出操作符輸出bitset物件中的位模式。

五、迭代器簡介

1、容器的iterator型別

(1)迭代器是一種檢查容器內元素並遍歷元素的資料型別。

(2)標準庫為每一種標準容器(包括vector)定義了相應的iterator型別,而這種型別支援(概念上的)迭代器的各種操作。但是只有少數的容器支援下標操作。

2、begin和end操作

vector::iterator iter = ivec.begin();
iter指向元素ivec[0],類似乙個指標。

由end操作返回的迭代器指向vector的「末端元素的下乙個」,指向了乙個不存在的元素。

3、自增和解引用運算

(1)解引用運算子:*。*iter = 0;

(2)迭代器的自增,是把容器中的迭代器「向前移動乙個位置」。

(3)不能對end操作返回的迭代器進行解引用或自增運算。

4、const_iterator與const迭代器

(1)使用const_iterator型別時,我們可以得到乙個迭代器,它自身的值可以改變,但不能用來改變其所指向的元素的值。可以對迭代器進行自增以及使用解引用操作符來讀取值,但不能對該元素賦值。若只需遍歷容器中的元素而無需修改他們,則可以使用const_iterator。

(2)const_iterator既可以用於const vector或非const vector。

(3)const迭代器是迭代器常量,該迭代器本身的值不能修改,即該迭代器在定義時需要初始化,而且初始化之後,就不能再指向其他元素。const迭代器幾乎沒有用。

vectornums(10);

const vector::iterator cit = nums.begin();

*cit = 1; //ok

++cit; //error

5、迭代器的算術操作

有兩種:

第一,iter + n;n的型別應為vector的size_type型別或difference_type型別。

第二,iter1 - iter2;結果為difference_type的signed型別的值。iter1和iter2都必須指向同一vector中的元素。

沒有定義兩個迭代器相加的操作:iter1 + iter2(非法)。

注意:任何改變vector長度的操作都會使已存在的迭代器失效!!比如push_back之後。

C 標準IO庫 C Primer學習筆記

頭檔案型別 iostream istream 從流中讀取 ostream 寫到流中去 iostream對流進行讀寫,從istream和ostream派生而來 fstream ifstream 從檔案中讀取,由istream派生而來 ofstream 寫到檔案中去,由ostream派生而來 fstre...

c primer學習筆記2 標準庫型別

1 string.size 的返回值型別為string size type,而不是int,不要把size的返回值賦給乙個int變數,可能溢位 實際上很多庫型別size操作的返回值型別都是size type型別,這是一種類似unsigned int的型別 同樣在進行索引時索引值也是size type型...

C Primer學習札記 標準bitset庫

一 標準庫bitset型別 標準庫提供bitset類來進行位集的處理,同其他的一些標準庫一樣,要使用bitset類就必須包含系相關標頭檔案 includeusing std bitset 二 bitset物件的定義和初始化 bitsetb b有n位,每位都為0 bitsetb u b是乙個unsig...