字符串處理一直是c/c++的弱項,string_algo庫很好的彌補了這一點。c++
string_algo 庫算法命名規則:
前綴i : 有這個前綴表名算法的大小寫不敏感,不然大小寫敏感
後綴_copy: 有這個後綴代表算法不變更輸入,返回處理結果的拷貝,不然算法原地處理
後綴_if : 有這個後綴代表算法須要一個做爲判斷式的謂詞函數對象,不然使用默認的判斷準則git
string_algo庫提供的算法共分五大類,以下:
【1】大小寫轉換;
【2】判斷式與分類;
【3】修剪;
【4】查找與替換;
【5】分隔與合併。算法
to_upper
to_lower函數
判斷式算法能夠檢測兩個字符串之間的關係,包括:
【1】starts_with:檢測一個字符串是不是另外一個的前綴;
【2】ends_with: 。。。。。。。。。。。。。。。後綴;
【3】contains:檢測一個字符串是否被另外一個包括;
【4】equals:檢測兩個字符串是否相等;
【5】lexicographical_compare;根據字典順序檢測一個字符串是否小於另外一個;
【6】all,檢測一個字符串中的全部元素是否知足指定的判斷式。
除了all,這些算法都有另外一個i前綴的版本,因爲他們不變更字符串,所以沒有_copy版本.spa
string_algo提供了一組分類函數,能夠用於檢測一個字符串是否符合某種特性,主要用於搭配其餘算法:
【1】is_space:字符是否爲空格;
【2】is_alnum:字符是否爲字母和數字字符;
【3】is_alpha:字符是否爲字母;
【4】is_cntrl:字符是否爲控制字符;
【5】is_digit:字符是否問十進制數字;
【6】is_graph:字符是否爲圖形字符;
【7】is_lower:字符手法爲小寫字符;
【8】is_print:字符是否爲打印字符;
【9】is_punct:字符是否爲標點符號字符;
【10】is_upper:字符是否爲大寫字符;
【11】is_xdigit:字符是否爲十六進制數字;
【12】is_any_of:字符是不是參數字符序列中的任意字符;
【13】if_from_range:字符是否位於指定區間內,即form<=ch<=to;
注意:這些函數並不真正地檢測字符,而是返回一個類型爲detail::is_classifiedF的函數對象,這個函數對象的operator()纔是真正的分類函數(所以,這些函數都屬於工廠函數)。
函數對象is_classifiedF重載了邏輯運算符||,&&和!,可使用邏輯運算符把它們組合成邏輯表達式,以實現更復雜的條件判斷;code
string_algo提供3個修剪算法,trim_left,trim_right和trim
修剪算法能夠刪除字符串開發或結尾部分的空格,它有_if和_copy兩種後綴,所以麼個算法有四個版本,_if版本接受一個判斷式IsSpace,將全部被斷定爲空格(IsSpace(c) == true)的字符刪除.orm
std::string strTrim = " hello ";std::cout << trim_copy_if(strTrim, is_space()) << std::endl;
string_algo提供的查找算法包括:
【1】find_first :查找字符串在輸入中第一次出現的位置。
【2】find_last :查找字符串在輸入中最後一次出現的位置。
【3】find_nth :查找字符串在輸入中的第n次(從0開始計數)出現的位置。
【4】find_head:取一個字符串開頭N個字符的字串,至關於substr(0,n);
【5】find_tail:取一個字符串末尾N個字符的字串。對象
替換與刪除:
替換,刪除操做時在查找到結果後再對字符串進行處理,它們算法名稱很類似:
【1】replace/erase_first:替換/刪除一個字符串在輸入中的第一次出現;
【2】replace/erase_last:。。。。。。。。。。。。。。。最後一次出現;
【3】replace/erase_nth:。。。。。。。。。。。。。。。。第n次(從0開始)出現;
【4】replace/erase_all:。。。。。。。。。。。。。。。。全部出現;
【5】replace/erase_head:替換/刪除輸入開頭;
【6】replace/erase_tail:替換/刪除輸入結尾;
前八個算法每一個都有前綴i,後綴_copy和組合,有四個版本,後四個只有後綴_copy的兩個版本。token
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;
5、分割與合併
分割函數split,合併函數join開發
分割
std::string strSplit = "A,,B,A::a,C-D,E_F";std::vector<std::string> 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 << "[" << *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 << "[" << *pos << "]" ;}std::cout << std::endl;
合併
std::vector<std::string> 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){return boost::contains(x, "A") || boost::contains(x, "B");}) <<std::endl;