(三)Boost庫之字串處理

2021-09-08 18:25:07 字數 3445 閱讀 4688

字串處理一直是c/c++的弱項,string_algo庫很好的彌補了這一點。

string_algo 庫演算法命名規則: 

字首i    : 有這個字首表名演算法的大小寫不敏感,否則大小寫敏感 

字尾_copy:  有這個字尾表明演算法不變動輸入,返回處理結果的拷貝,否則演算法原地處理 

字尾_if  :  有這個字尾表明演算法需要乙個作為判斷式的謂詞函式物件,否則使用預設的判斷準則

string_algo庫提供的演算法共分五大類,如下: 

大小寫轉換; 

判斷式與分類;  

修剪; 

查詢與替換; 

分隔與合併。

to_upper 

to_lower

判斷式演算法可以檢測兩個字串之間的關係,包括: 

starts_with:檢測乙個字串是否是另乙個的字首; 

ends_with: 。。。。。。。。。。。。。。。字尾; 

contains:檢測乙個字串是否被另乙個包括; 

equals:檢測兩個字串是否相等; 

lexicographical_compare;根據字典順序檢測乙個字串是否小於另乙個; 

all,檢測乙個字串中的所有元素是否滿足指定的判斷式。 

除了all,這些演算法都有另乙個i字首的版本,由於他們不變動字串,因此沒有_copy版本.

string_algo提供了一組分類函式,可以用於檢測乙個字串是否符合某種特性,主要用於搭配其他演算法: 

is_space:字元是否為空格; 

is_alnum:字元是否為字母和數字字元; 

is_alpha:字元是否為字母; 

is_cntrl:字元是否為控制字元; 

is_digit:字元是否問十進位制數字; 

is_graph:字元是否為圖形字元; 

is_lower:字元手法為小寫字元; 

is_print:字元是否為列印字元; 

is_punct:字元是否為標點符號字元; 

is_upper:字元是否為大寫字元; 

is_xdigit:字元是否為十六進製制數字; 

is_any_of:字元是否是引數字串行中的任意字元; 

if_from_range:字元是否位於指定區間內,即form<=ch<=to; 

注意:這些函式並不真正地檢測字元,而是返回乙個型別為detail::is_classifiedf的函式物件,這個函式物件的operator()才是真正的分類函式(因此,這些函式都屬於工廠函式)。 

函式物件is_classifiedf過載了邏輯運算子||,&&和!,可以使用邏輯運算子把它們組合成邏輯表示式,以實現更複雜的條件判斷;

string_algo提供3個修剪演算法,trim_left,trim_right和trim 

修剪演算法可以刪除字串開發或結尾部分的空格,它有_if和_copy兩種字尾,因此麼個演算法有四個版本,_if版本接受乙個判斷式isspace,將所有被判定為空格(isspace(c) == true)的字元刪除.

std::string strtrim = "hello ";

std::cout << trim_copy_if(strtrim, is_space()) << std::endl;

string_algo提供的查詢演算法包括: 

find_first :查詢字串在輸入中第一次出現的位置。 

find_last :查詢字串在輸入中最後一次出現的位置。 

find_nth :查詢字串在輸入中的第n次(從0開始計數)出現的位置。 

find_head:取乙個字串開頭n個字元的字串,相當於substr(0,n); 

find_tail:取乙個字串末尾n個字元的字串。

替換與刪除: 

替換,刪除操作時在查詢到結果後再對字串進行處理,它們演算法名稱很相似: 

replace/erase_first:替換/刪除乙個字串在輸入中的第一次出現; 

replace/erase_last:。。。。。。。。。。。。。。。最後一次出現; 

replace/erase_nth:。。。。。。。。。。。。。。。。第n次(從0開始)出現; 

replace/erase_all:。。。。。。。。。。。。。。。。所有出現; 

replace/erase_head:替換/刪除輸入開頭; 

replace/erase_tail:替換/刪除輸入結尾; 

前八個演算法每個都有字首i,字尾_copy和組合,有四個版本,後四個只有字尾_copy的兩個版本。

std::cout << replace_all_copy(strre, "beat", "beat") << std::endl; 

ireplace_all(strre, "samus", "samus"); 

std::cout << strre << std::endl;

std::cout << erase_tail_copy(strre, 10) << std::endl;

五、分割與合併 

分割函式split,合併函式join

分割

std::string strsplit = "a,,b,a::a,c-d,e_f";

std::vector l;

//token_compress_on :連續兩個分隔符被視為乙個,預設為token_compress_off,連續兩個分隔符視為乙個空字元

split(l, strsplit, is_any_of(",:-_"));

for (boost_auto(pos, l.begin()); pos != l.end(); ++pos)

std::cout <<  std::endl;

l.clear();
split(l, strsplit, is_any_of(","), token_compress_on);

for (boost_auto(pos, l.begin()); pos != l.end(); ++pos)

std::cout <<  std::endl;

合併

std::vector v = boost::assign::list_of("a")("b")("c")("d"); 

std::cout << boost::join( v, ",") << std::endl; 

//條件格式串接

std::cout << boost::join_if(v, "*",

(const std::string& x)) <

boost 字串處理

c 在stl庫中提供了乙個string類用以代替c語言的char 來實現字串功能,不過stl的string只提供了乙個連線字串和查詢的功能,其它的常用函式幾乎一律沒有,就連字串替換都得自己來實現,和c 的字串函式比起來簡直弱爆了。boost庫在標頭檔案中提供了不少字串處理函式,用以幫助我們實現基本的...

Boost庫 字串操作

結合boost官網 由於這一章內容過多,我將採用四個小章,精簡原文四個小部分內容。第四小章還包含了題目及講解。區域設定 setlocale lc all,locale global std locale german 設定全域性區域德語環境 一 將字串所有字元轉成大寫 boost algorithm...

優秀的boost字串處理

我將把我認為非常有用,c 標準庫又不是特別完備的做下重新學習做下筆記 字串處理,檔案系統等 在c 03中字串的處理相當不靈活 對比mfc的cstring的實現,我們可以發現string不僅缺少了分詞的tokenizer,替換字串的replace也沒有實現根據輸入子串的替換,不僅沒有format還缺少...