C 之標準庫的特殊元素

2021-08-02 12:13:50 字數 3631 閱讀 2195

一、tuple 型別

tuple是類似pair的模板,可以將一些資料組合成單一的物件而不用定義乙個新的資料結構。不同tuple型別的成員型別不同,但乙個tuple可以有任意數量的成員。tuple的乙個常用的用途就是在函式中一次性返回多個值。

1、定義和初始化

定義乙個tuple時,需要指出每個成員的型別。其預設建構函式會進行值初始化,而初始值初始化的建構函式是explicit的。

tuplet;//預設建構函式,值初始化

tuplet (v1,v2,...,vn);//建構函式是explicit的,直接初始化

make_tuple(v1,v2,...,vn);//返回乙個給定初始值初始化的tuple。型別根據初始值自動推斷

2、元素的訪問

要訪問tuple的元素,需要利用到乙個名為get的標準庫函式模板。見括號內的表示式必須為整型常量表示式。

get(t);//返回t的第i個資料成員的引用。可以是左值引用。

tuple_size::value;//返回尖括號內tuple型別的資料成員的個數

tuple_element::type;//返回第i個資料成員的型別

二、bitset 型別

標準庫中定義了bitset類,用來實現位運算,且能夠處理超過最長整型型別大小的位集合。bitset類定義在標頭檔案bitset中。

1、定義和初始化

bitset類類似於array類,具有固定的大小,因此在定義時需要知名其包含多少個二進位制位。

bitsetb; //b有n位,每一位都是0,對應的建構函式是constexpr

bitsetb(u); //b是unsigned long long 型別的u 的低n位拷貝。如果若是n大於unsigned long long 的大小,超出的部分被置為0

bitsetb(s, pos, m, zero, one);//s是string型別,其中的字元只能包含0和1。從pos位置開始拷貝m個字元

bitsetb(cp, pos, m, zero, one);//從cp指向的字元陣列中拷貝字元

2、操作

b.any();//檢測b中是否存1

b.all();//檢測b的所有位是否都是1

b.none();//檢測b中的位是否都是0

b.count();//b中置位的個數

b.size();//返回b中的位數

b.test(pos);//檢測pos位是否是1

b.set(pos,v);//將pos位置為v

b.set();//將b的所有位置位

b.reset(pos);//將b中的pos位復位

b.reset();//將b復位

b.flip(pos);//改變pos位的狀態

b.flip();//改變b所有位的狀態

b[pos];//訪問pos位

b.to_ulong();//返回乙個unsigned long 型別的值,其位模式與b相同

b.to_ullong();//返回乙個unsigned long long 型別的值,其位模式與b相同

b.to_string(zero,one) //返回乙個string,表示b中的位模式

os << b;//將b中的二進位制位列印到流os

is >> b;//從is讀取字元存入b。當字元不是0,1或者達到b的大小時停止讀取

三、正規表示式

正規表示式是一種描述字串行的方法。re庫被定義在regex標頭檔案中。

1、regex元件

表示有乙個正規表示式的類。可以使用乙個string、乙個表示字元範圍的迭代器對、乙個指向空字元結尾的字元陣列指標、乙個字元指標、乙個花括號包圍的字元列表來初始化這個類。

regex r(re);

regex r(re, f);//f指出物件如何處理的標誌

r1 = re;

r1.assign(re, f);//與賦值運算子效果相同

r.mark_count();//r中子表示式的數目

r.flags();//返回r的標誌集

//定義regex時的標誌f

icase //匹配過程中忽略大小寫

nosubs //不儲存匹配的子表示式

optimize //執行速度優於構造速度

ecmascript //使用ecma-262指定的語法

basic //使用posix基本的正規表示式語法

extended //使用posix擴充套件的正規表示式語法

awk //使用posix版本的awk語言的語法

grep //使用posix版本的grep語法

egrep //使用posix版本的egrep語法

由於在正規表示式語言中,一些符號存在特殊含義,需要用反斜槓來去除其特殊含義,而在c++中反斜槓也是乙個特殊字元,因此也需要使用乙個反斜槓來獲取乙個普通的反斜槓字元。因此,在c++中的正規表示式中,往往需要使用雙反斜槓來獲取正確的正規表示式中特殊字元的普通含義。例如: . 在正規表示式中表示匹配任意字元,如要使用 \.  表示普通的 . 字元,而在c++中用 \\ 來獲取普通的 \  , 乙個普通的 . 在c++中正規表示式為 \\. 。 

2、regex_match元件

3、regex_search元件

4、regex_replace元件

5、sregex_iterator元件

四、隨機數

定義在標頭檔案random的隨機數庫通過一組協作的類來解決隨機數的產生問題:隨機數引擎類和隨機數分布類。乙個引擎類可以生成unsigned隨機數序列,乙個分布類可以使引擎類生成指定型別的、在給定範圍內的、服從特定概率分布的隨機數。

1、隨機數引擎

隨機數引擎是函式物件類,其定義了乙個呼叫運算子,不接受引數並返回乙個無符號整數。隨機數引擎和rand函式的區別:隨機數引擎生成的無符號整數在乙個系統定義的範圍,而rand函式生成的隨機數範圍是在0到rand_max之間。

engine e; //預設建構函式,使用該引擎型別預設的種子

engine e(s); // 使用整型值s作為種子

e.seed(s); //使用種子s重置引擎狀態

e.min(); //此引擎生成隨機數的最小值

e.max(); //此引擎生成隨機數的最大值

engine::result_type //此引擎生成的無符號整型型別

e.discard(u); //將引擎推進u步,u的型別為unsigned long long

2、隨機數分布

隨機數引擎產生的隨機數是原始的隨機數,往往不不符合我們的需求,因此需要對其進行轉換以滿足要求。而隨機數分布類就是解決這個問題的。分布型別也是乙個函式物件類,分布型別定義了乙個呼叫運算子,接受乙個隨機數引擎作為引數,將原始隨機數對映到指定的分布。

隨機數引擎型別和隨機數分布型別組合起來稱之為隨機數發生器。乙個給定的隨機數發生器一直產生相同的隨機數序列。可以將其定義成static型別,以消除該現象。也可以通過設定隨機種子來避免:在建立引擎物件時提供種子;呼叫引擎的seed成員。

C 標準庫之

iomanip在c 程式裡面經常見到下面的標頭檔案 include io代表輸入輸出,manip是manipulator 操縱器 的縮寫 在c 上只能通過輸入縮寫才有效。dec 設定整數為十進位制 hex 設定整數為十六進製制 oct 設定整數為八進位制 setbase n 設定整數為n進製 n 8...

C 標準庫之cctype

c 語言下 標頭檔案 include 說明 字元處理庫 功能一 字元測試 1 函式原型均為int is x int 2 引數為int,任何實參均被提公升成整型 3 只能正確處理處於 0,127 之間的值 功能二 字元對映 1 函式原型為int to x int 2 對引數進行檢測,若符合範圍則轉換,...

C 標準庫之iomanip

c 語言下 標頭檔案 include 說明 是i o流控制標頭檔案,就像c裡面的格式化輸出一樣 控 制 符 作 用 dec 設定整數為十進位制 hex設定整數為十六進製制 oct設定整數為八進位制 setbase n 設定整數為n進製 n 8,10,16 setfill n 設定字元填充,c可以是字...