(三)Boost库之字符串处理
字符串處理一直是c/c++的弱項,string_algo庫很好的彌補了這一點。
string_algo 庫算法命名規則:?
前綴i??? : 有這個前綴表名算法的大小寫不敏感,否則大小寫敏感?
后綴_copy:? 有這個后綴表明算法不變動輸入,返回處理結果的拷貝,否則算法原地處理?
后綴_if? :? 有這個后綴表明算法需要一個作為判斷式的謂詞函數對象,否則使用默認的判斷準則
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版本.
?
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重載了邏輯運算符||,&&和!,可以使用邏輯運算符把它們組合成邏輯表達式,以實現更復雜的條件判斷;
三、修剪
string_algo提供3個修剪算法,trim_left,trim_right和trim?
修剪算法可以刪除字符串開發或結尾部分的空格,它有_if和_copy兩種后綴,因此么個算法有四個版本,_if版本接受一個判斷式IsSpace,將所有被判定為空格(IsSpace(c) == true)的字符刪除.
四、查找與替換
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的兩個版本。
五、分割與合并?
分割函數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;
總結
以上是生活随笔為你收集整理的(三)Boost库之字符串处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (二)boost库之字符串格式化
- 下一篇: (四)boost库之正则表达式regex