boost庫之tokenizer的使用

2021-09-23 22:46:01 字數 2250 閱讀 2028

在tokenizer出現之前,如果我們要對乙個字串進行分割,可能要自己封裝乙個函式。如果有n種不同的分割規則,那麼你

要封裝n個不同的分割函式……太麻煩了!現在好了,boost庫的tokenizer封裝了統一的語法來分割字串,並且提供了三

種常用的分割方式,足以滿足我們的絕大多數程式設計需求。

tokenizer主要由分割器和迭代器兩部分組成。分割器用於指定字串的分割規則,如果不指定任何分割器,則tokenizer

預設將字串以空格和標點(鍵盤上除26個字母(包括大小寫)和數字外的其他可列印字元)為邊界進行分割。迭代器用於

儲存字串分割後的結果。下面著重介紹tokenizer的三種分割器。

■ char_separator是預設的分隔器,它以一組特定的字元來分隔字串,其建構函式為:

explicit char_separator(); (預設建構函式)

explicit char_separator(const char* dropped_delims, const char* kept_delims = "", empty_token_policy

empty_tokens = drop_empty_tokens);

其引數的詳細說明如下:

◆ dropped_delims和kept_delims:是兩個字元陣列,這兩個陣列中的每個字元都是乙個分割符。不同的是,

dropped_delims中的分割符本身被丟棄,而kept_delims中的分割符本身作為乙個單獨的記號被保留在迭代器中。預設構

造函式的dropped_delims為空格符,kept_delims為標點符號。

◆ empty_tokens:是否保留長度0的記號。它有兩個可選值,keep_empty_tokens表示要保留空記號,而預設的

drop_empty_tokens表示丟棄空記號。預設建構函式的empty_tokens為drop_empty_tokens。

■ offset_separator主要用於解析長度和格式都固定的字串,如身份證或**號碼等。其建構函式為:

templateoffset_separator(iter begin,iter end,bool bwrapoffsets = true, bool

breturnpartiallast = true);

其引數的詳細說明如下:

◆ begin和end:指向乙個整數容器開始和末尾的迭代器,其中每個元素表示要分割的字段的字元數。

◆ bwrapoffsets: 如果字串長度大於整數容器中所有字段長度的和,是否重複解析字串。

◆ breturnpartiallast: 當字串解析到末尾剩餘部分的長度(注意:包括結尾的空字元)小於字段長度時,是保留還是丟

棄剩餘部分。

■ escaped_list_separator主要用於解析包含轉義符、分隔符和引號的字串。其建構函式為:

explicit escaped_list_separator(char e = '\\', char c = ',',char q = '\"');

explicit escaped_list_separator(string_type e, string_type c, string_type q);

其引數的詳細說明如下:

◆ e:為單個轉義符或包含多個轉義符的串。轉義符後跟引號表示引號,轉義符後跟n表示換行,連續兩個轉義符表示作為普

通字元的轉義符本身。

◆ c:為單個分割符或包含多個分割符的串,字串以該分隔符為邊界進行分割。

◆ q:為單個引號或包含多個引號的串,兩個引號中間出現的分隔符不再作為分割標誌,而是作為普通字元處理。

最後給出一組簡單的測試題,大家既可以藉此看看tokenizer的語法,也可以根據回答結果來考察一下你對tokenizer的用

a) string s = "hello, crearo-sw blog";

tokenizer<> tok(s);

for (tokenizer<>::iterator beg=tok.begin(); beg!=tok.end(); ++beg)

c) string s = "20090321";

int offsets = ;

offset_separator f(offsets, offsets+3, true, false);

tokenizertok(s,f);

for(tokenizer::iterator beg=tok.begin();

beg!=tok.end(); ++beg)

(八)boost庫之異常處理

今天使用boost庫,將輕鬆的解決這個問題。先看看使用stl中的異常類的一般做法 使用stl定義自己的異常 class myexception public std exception myexception const char const msg,int errcode exception ms...

(七)boost庫之單例類

一 boost.serialzation的單件實現 單例模式是一種常用的軟體設計模式。在它的核心結構中只包含乙個被稱為單例類的特殊類。通過單例模式可以保證系統中乙個類只有乙個例項而且該例項易於外界訪問,從而方便對例項個數的控制並節約系統資源。如果希望在系統中某個類的物件只能存在乙個,單例模式是最好的...

boost庫下檔案處理庫 探索Boost檔案系統庫

c 語言 實際上是c 標準 最常見的問題之一是缺少定義明確的庫來幫助處理檔案系統查詢和操作。這種缺席導致程式設計師使用本機作業系統提供的應用程式介面 api 從而使 無法跨平台移植。考慮乙個簡單的情況 您需要確定檔案是否為目錄型別。在microsoft windows 平台中,可以通過呼叫windo...