第117講boostalgorithmstring之分割與合并_第1頁
第117講boostalgorithmstring之分割與合并_第2頁
第117講boostalgorithmstring之分割與合并_第3頁
免費預(yù)覽已結(jié)束,剩余1頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、第 117 講 boostalgorithmstring 之分割與合并在 boost 的字符串算法中,關(guān)于分割的函數(shù)應(yīng)該是有 2 個的,還記得我們在 115 講里面說到的 find_all 嗎?從某些 角度來說這也算是一種分割方式,只是這比較特殊一些,所 有的結(jié)果都是一樣的而已,那么這一講我們來說一個一般的 分割,其實關(guān)于分割大家都比較清楚的了,簡單點說就是將 一個字符串按照某種方式將他分成 N 多段,這種對字符串的 操作通常很有用,在實際項目中對字符串的處理可以說是隨 處可見,而分割字符串更是家常便飯了,那么說了這么多廢 話,我們來點實際的東西。 /= template inline Seq

2、uenceSequenceT& split( SequenceSequenceT& Result, RangeT& Input, PredicateT Pred, token_compress_mode_type eCompress=token_compress_off ) /=這就是split的函數(shù)聲明,SequenceSequenceT可以是vector, deque, list 等標準容器,對 Input 的要求也沒那么多,通常 于我們來說只要是 string 或者是 boost:iterator_range 即可, 當然我們通常都是對 string 進行處理的,所以這我們就不關(guān) 心了,

3、 PredicateT 是一個判斷式,可以理解為一個函數(shù)對象, 因為這里是當以當前字符為參數(shù)時返回 true 的話那么當前點 就是一個分割點, 我們不用糾結(jié)這東西, boost 本身就提供有 一個已經(jīng)很完備的判斷式了 :is_any_of, 我們只需要將我們要 分割的東西給他就行,看下面的例子就知道。在結(jié)果中分割 字符串是要被丟棄的。 token_compress_mode_type 這個參數(shù) 的目的簡單點說就是這種形式 : ,這里是當作兩個 :號來處 理呢還是就是 :號來處理?嗯, 這句話說得不清不楚, 還好在 程序有時候比語言的表述來更直接一些: /=string str(Hello :

4、World);vector result;split(result,str,is_any_of( :); / 使用空格和 : 來進行分割 / 這里會得到結(jié)果是 Hello World result.clear();split(result, str, is_any_of( :),token_compress_on); / 使用空格和 :進行分割 / result : Hellow World /= 還是代碼來得實在一些,簡單兩句代碼就將一些于我來說 很難用語言來描述的現(xiàn)象給解釋清楚了,從上面的函數(shù)原型 里面我們看到 split 的最后一個參數(shù)是有默認值的,那就是 token_compress_

5、off ,這就是不壓縮處理,而我們開啟壓縮處 理后,那些 : 都被當成一個 :,有因為空格和 :都是連在一起 的,而空格也是被定義為分隔符,所以也都被壓縮在一起進 行處理了。于是乎我們就得到了想要的 Hellow World 了。 和 split 相對的是 join ,顧名思義,這就是將字符串連接起 來,所以他的用法很簡單,不過他有兩個版本,一個帶有 _if 后綴的版本,這自然是需要一個判斷式,只有滿足判斷式的 字符串才會被添加到鏈接隊列之中,我們來看看他們的用 法: /= std:string str(Hello,World,Ni,Hao,A);std:vector v_str;boost:

6、algorithm:split(v_str, str, boost:algorithm:is_any_of(,),boost:algorithm:token_compres s_on); / 將字符串按照,號進行分割 std:string _str = boost:algorithm:join(v_str, -); / 再將字 符串重新連接起來 / Hello-World-Ni-Hao-A std:string _str2 = boost:algorithm:join_if(v_str, -, &(const std:string& s) return boost:algorithm:cont

7、ains(s, l); ); / 只連接包含 l 字符的字符串 / 結(jié)果為 Hello-World /= 不論是 split 還是 join ,他們都是對字符串進行處理,那么 很多時候我們可能想要的不是字符串,有可能是其他的東 西,比如是數(shù)字等等,為了解決這個問題,我們可以對 split 和 join 進行擴展(可以參考我們前面說的 MString ,他們可 以轉(zhuǎn)變?yōu)槿我忸愋偷臇|西 )。/=templa te class Cvoid _split(C& result, const std:string& input,const std:string& spliter,bool isPress

8、= false) result.clear(); if (input.empty() return; std:vector _result; boost:algorithm:token_compress_mode_type _type; if (isPress) _type = boost:algorithm:token_compress_on; else _type = boost:algorithm:token_compress_off; boost:algorithm:split(_result, input, boost:is_any_of(spliter), _type);for (

9、auto& t : _result) try T _t = boost:lexical_cast(t); result.push_back(_t); catch (boost:bad_lexical_cast e) ; /=/ 針對 string 進 行特化 /=template class Cvoid _split(C& result, const std:string& input, const std:string& spliter, bool isPress = false) result.clear(); if (input.empty() return; std:vector _r

10、esult; boost:algorithm:token_compress_mode_type _type; if (isPress) _type = boost:algorithm:token_compress_on; else _type = boost:algorithm:token_compress_off; boost:algorithm:split(result, input, boost:is_any_of(spliter), _type);templateclass Cstd:string _join(const C& Input, const std:string& join

11、er) std:vector _v_str; for (auto& c : Input) try std:string str = boost:lexical_cast(c);_v_str.push_back(str); catch (boost:bad_lexical_cast e) ; return boost:join(_v_str, joiner); /= =/ 同樣需要針對 string 進行特化 /= =templateclass Cstd:string _join(const C& Input, const std:string& joiner) return boost:joi

12、n(Input, joiner); /=現(xiàn)在使用起來就變得相對簡單了:/= =int main() std:string str(hello,World,Ni,Hao,A); std:vector v_str; _split(v_str, str, ,);std:cout for (auto & v : v_str) std:cout std:string _str= _join(v_str, -);std:cout std:cout std:string _str2 = boost:algorithm:join_if(v_str, -, &(const std:string& s) return boost:algorithm:contains(s, l); );std:cout std:coutstr = Hello : World; v_str.clear(); boost:algorithm:split(v_str, str, boost:algorithm:is_any_of( :),boost:algorithm:token_compre ss_on);str = (123,345,981,3345,98); std:vector v_int; _split(v_int, str, ,);

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論