說明:本文是boost::tokenizer類的整理,原文出處為boost的document,此處僅作學習筆記之用。
1、boost::tokenizer
boost::tokenizer提供了一種靈活、易用的方式來將乙個字串分解為乙個字串列表。這是個模板類,類的宣告為:
template <
class tokenizerfunc = char_delimiters_separator,
class iterator = std::string::const_iterator,
class type = std::string
>
class tokenizer
它的核心包括,
boost::tokenizer的建構函式有以下兩個:
tokenizer(iterator first, iterator last,const tokenizerfunc& f = tokenizerfunc())
templatetokenizer(const container& c,const tokenizerfunc& f = tokenizerfunc())
其中引數的意義如下:引數描述c
乙個包含被分解的序列的容器。注:c.begin()
和 c.end() 必須可以轉換為模板引數 iterator.
f乙個符合
tokenizerfunction 的函式物件,用於對序列進行分解。
first
迭代器,表示被分解序列的開始位置。
last
迭代器,表示被分解序列的末尾位置。
tokenizer的使用很簡單,以下示例為使用預設引數進行分割字串,
#include#include#includeint main()
}
tokenizer中使用的tokenfunc在boost標準中有其他3個實現,它們分別有不同的分割規則:
2、boost::char_seperator
char_separator
類基於字元分隔符來分解乙個字串行,就象strtok()
所做的那樣(但沒有不可重入以及輸入序列析構的問題)。
char_separator
類與token_iterator
或tokenizer
一起使用以執行單詞分解。
strtok()
函式在單詞輸出序列中不包含用於匹配的字元分隔符。但是,在輸出序列中顯示這些分隔符有時候是有用的,所以char_separator
將這個功能作為乙個選項提供。我們將在輸出單詞中包含分隔符稱為 保留分隔符
,而將在輸出單詞中不包含分隔符稱為 被棄分隔符
。當在輸入序列中出現兩個連續的分隔符時,有乙個問題就是是否要輸出乙個 空白單詞
或是直接跳過。strtok()
的行為是跳過。而char_separator
類則提供了兩個選項。
第乙個例子示範如何將char_separator
作為strtok()
函式的替代物來使用。我們指定了三個字元分隔符,它們不出現在輸出單詞中。我們沒有指定任何保留分隔符,而且預設情況是忽略空白單詞。
輸出結果是:// char_sep_example_1.cpp
#include #include #include int main()
下乙個例子示範了用兩個被棄分隔符 '-' 和 ';' 以及乙個保留分隔符 '|' 來進行單詞分解。我們還指定了當出現兩個連續的分隔符時,要在輸出中包含空白單詞。
輸出結果是:// char_sep_example_2.cpp
#include #include #include int main()
最後乙個例子示範了使用<> <> <|> <|> <> <|> <> <> <|> <>
char_separator
的預設建構函式,按標點和空格來進行單詞分解。
輸出結果是:// char_sep_example_3.cpp
#include #include #include int main()
引數<,>
描述預設值
char
單詞中的元素型別,通常為char
.
traits
字元型別的char_traits
.
char_traits
3、escaped_list_seperator
escaped_list_separator
類是 tokenizerfunction 的乙個實現。escaped_list_separator 對乙個 csv (逗號分隔) 格式進行分解。以下是該模式的一些例子。它使用預設的分隔符、引號和轉義符。
field 1,field 2,field 3
field 1,"field 2, with comma",field 3
field 1,field 2 with \"embedded quote\",field 3
field 1, field 2 with \n new line,field 3
field 1, field 2 with embedded \\ ,field 3
字段通常以逗號分隔。如果你想把逗號放入欄位中,你就要用引號把它括起來。另外還支援以下三個轉義序列
轉義序列 結果
nnewline
其中 是指定為引號的任意字元,而 則是指定為轉義字元的任意字元。
// ******_example_2.cpp
#include#include#includeint main()
}
escaped_list_separator 有兩個建構函式。分別如下:
explicit escaped_list_separator(char e = '\\', char c = ',',char q = '\"')引數 描述
ec指定用作字段分隔的字元
q指定用作引號的字元
escaped_list_separator(string_type e, string_type c, string_type q):引數 描述
e字串 e 中的字元都被視為轉義字元。如果給定的是空字串,則沒有轉義字元。
c字串 c 中的字元都被視為分隔符。如果給定的是空字串,則沒有分隔符。
q字串 q 中的字元都被視為引號字元。如果給定的是空字串,則沒有引號字元。
使用這個類時,將它的某個物件傳給 tokenizer 包中需要 tokenizerfunction 的地方。
引數描述
char
單詞中的元素型別,通常為char
.
traits
字元型別的 traits 類,用於比較字元。預設為 std::char_traits
4、offset_seperator
// ******_example_3.cpp
#include#include#includeint main();
offset_separator f(offsets, offsets+3);
tokenizertok(s,f);
for(tokenizer::iterator beg=tok.begin(); beg!=tok.end();++beg)
}
offset_separator 有乙個有用的建構函式(預設建構函式只是為了讓某些編譯器高興)。宣告如下:
template引數 描述offset_separator(iter begin,iter end,bool bwrapoffsets = true, bool breturnpartiallast = true)
begin, end
指定整數偏移量序列
bwrapoffsets
指明當所有偏移量用完後是否迴繞到偏移量序列的開頭繼續。例如字串 "1225200101012002" 用偏移量 (2,2,4) 分解,如果 bwrapoffsets 為 true, 則分解為 12 25 2001 01 01 2002. 如果 bwrapoffsets 為 false, 則分解為 12 25 2001,然後就由於偏移量用完而結束。
breturnpartiallast
指明當被分解序列在生成當前偏移量所需的字元數之前結束,是否建立乙個單詞,或是忽略它。例如字串 "122501" 用偏移量 (2,2,4) 分解,如果 breturnpartiallast 為 true,則分解為 12 25 01. 如果為 false, 則分解為 12 25,然後就由於序列中只剩下2個字元不足4個而結束。
使用這個類時,將它的某個物件傳入到任何需要 tokenizerfunction 的地方。如果該物件是預設構造的,則被分解序列中的每個字元將被作為乙個單詞返回(即預設值為偏移量 1, 且 bwrapoffsets 為 true)。
boost tokenizer 字串按格式分解
tokenizer 庫提供預定義好的四個分詞物件,其中char delimiters separator已棄用.其他如下 char separator有兩個建構函式 1.char separator 使用函式 std isspace 來識別被棄分隔符,同時使用 std ispunct 來識別保留分隔...
用Margin還是用Padding
用margin還是用padding 何時應當使用margin 需要在border外側新增空白時。空白處不需要背景 色 時。上下相連的兩個盒子之間的空白,需要相互抵消時。如15px 20px的margin,將得到20px的空白。何時應當時用padding 需要在border內測新增空白時。空白處需要背...
用Margin還是用Padding
用margin還是用padding這個問題是每個學習css高階時的必經之路。css邊距屬性定義元素周圍的空間。通過使用單獨的屬性,可以對上 右 下 左的外邊距進行設定。也可以使用簡寫的外邊距屬性同時改變所有的外邊距。w3school 邊界 margin 元素周圍生成額外的空白區。空白區 通常是指其他...