字串處理一直是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還缺少...