1. 程式人生 > >c++ primer 第十七章標準庫特殊設施

c++ primer 第十七章標準庫特殊設施

c++ primer 第十七章標準庫特殊設施

17.1 tuple型別

tuple可以有任意數量的成員,每個成員都有對應的型別。

17.1.1 定義和初始化tuple

定義時需要指定每個成員的型別。

建構函式是explicit的,需要直接初始化。

make_tuple可以自動推斷成員型別。

使用get<1>(item)訪問tuple中的成員。

17.2 bitset 型別

bitset類是一個二進位制位集合的類。

17.2.1 定義和初始化bitset

定義時需要指定bitset的長度。可以從一個unsigned整型或者字串進行初始化得到。

17.3 正則表示式

regex標頭檔案中包含了C++正則表示式相關的庫。

17.3.1 使用正則表示式庫

regex_search 搜尋字串中第一個匹配的字串。

regex_error在執行時跑出正則表示式的錯誤。

正則表示式是在執行中編譯的,因此很慢。避免建立不必要的正則表示式。

對應不同的字串和字元陣列有不同的匹配結果型別。

17.3.2 匹配與Regex迭代器型別

使用regex_iterator可以得到所有匹配的字串的迭代器。使用遞增運算可以推進其呼叫regex_search的結果。

可以得到匹配的前面和後面的部分。

17.3.3 使用子表示式

模式中括號包起來的部分叫做子表示式,可以在結果中只使用子表示式的匹配結果。

在match結果中直接使用下標表達式呼叫對應的子表示式匹配的部分。

17.3.4 使用regex_replace

可以使用regex_replace將匹配表示式的字串更換成另外的格式。

新的格式中需要呼叫子表示式時使用$2的形式,在std:regex_constants中。

17.4 隨機數

C++ 新標準中使用random標頭檔案中的隨機數引擎與隨機數分佈類的配合來完成隨機數生成的工作。

17.4.1 隨機數引擎和分佈

default_random_engine e;表示生成一個隨機數引擎。隨機數引擎是一個函式呼叫類,可以呼叫e()返回一個隨機無符號整數。

隨機數引擎可以設定種子返回最大範圍最小範圍等操作。

使用一個分佈型別的物件來得到一個指定範圍的分佈物件。分佈型別也是函式物件類,呼叫時接受一個隨機數引擎做引數。

int randomInt(unsigned int s,unsigned beg, unsigned end) {
	default_random_engine e(s);
	uniform_int_distribution<unsigned> u(beg,end);
	u(e); //此處不先呼叫一次的話返回值都是一樣的,不知為何
	return u(e);
}

分佈型別與隨機數引擎的合作如程式碼所示。

為了避免隨機數引擎返回相同的結果,可以選擇設定其物件為靜態型別或者是傳入不同的隨機數種子。

17.4.2 其它隨機數分佈

可以生成一些其他分佈型別,比如0到1的隨機double型別或者伯努利分佈等等。

17.5 IO庫再探

17.5.1 格式化輸入和輸出

標準庫定義了一組操縱符來修改流的格式狀態,並且可以作為運算子的運算物件。比如endl。

很多操縱符改變格式的狀態。比如boolalpha控制布林值的輸出格式,整數輸出的進位制控制等等。

對浮點數指定輸出格式。精度,進位制和小數點等等。還可以新增空白或其它字元,選擇輸入不跳過空白符號等等。

17.5.2 未格式化的輸入/輸出操作

標準庫還支援一組底層操作,支援未格式化的IO,允許將一個流當做一個無解釋的位元組序列來處理。

可以讀取單個位元組,將一個字元放回流等等操作。

也可以get或getline等進行多個位元組資料的操作。

17.5.3 流隨機訪問

seek和tell函式可以設定在輸入輸出流中定位的位置。

通過tell和seek設定和讀取當前的位置,可以實現對流的隨機訪問。但需要注意的是一個流中只有一個位置標記,因此如果需要改變當前讀或寫的位置就要重新設定位置。