分隔和截斷字符串, boost string algorithm library中的split和trim


http://www.boost.org/doc/libs/1_46_1/doc/html/string_algo.html

這個庫是個 headers only library  這個庫提供了STL沒有提供的 string-related算法,  但是實現做到了可以用在任何 character 的 container上

split

在寫在線狀態的改造時候要把一個字符串中描述的幾種類型拆出來, 引發了這個問題, 去標准庫里找了也沒找到, 后來在boost庫中找到了string_algo這個庫,   以下是我寫的一個使用split的例子

 1 #include <boost/algorithm/string.hpp>
 2 #include <iostream>
 3 #include <string>
 4 #include <vector>
 5 using namespace boost::algorithm;
 6 using namespace std;
 7 int main(){
 8     string str("miss,you.just.call_to,say,I~love~you");
 9     vector<string> strVec;
10     split(strVec, str, is_any_of(",."));
11     vector<string>::iterator it = strVec.begin();
12     for (; it!=strVec.end(); it++){
13         cout << *it << endl;
14     }
15     return 0;
16 }

運行的結果就是都拆出來了  miss you  just  call to  say   I~love~you,  注意分隔符是,.  沒有用~,  所有后面的I~love~you沒有拆

頭文件統一的話就用的#include<boost/algorithm/string.hpp>    9, 10行就是split的使用方式

2.  我們用的頭文件是 boost/algorithm/string.hpp,   這個頭文件只用來包括其他具體的頭文件, 在 algorithm/string目錄下如 split的就是   boost/algorithm/string/split.hpp,   里面定義了幾個函數模板, 應該說這里面全是函數模板,  另外還可以看到, 這就是headers only library

trim

在寫群聊中有遇到去掉一個string當中的空格,std中沒有這樣的算法,在boost::string_algo中找到了trim, 但它只能去除頭尾,這個也很有用, 頭文件是  <boost/algorithm/string/trim.hpp> 或<boost/algorithm/string.hpp>, 寫了一些trim的測試代碼

#include <boost/algorithm/string.hpp>
 #include <iostream>
 #include <string>
 
 using namespace boost::algorithm;
 using namespace std;
 
 int main(){
     string str = "     abc     ...     ";
     cout << "before trim str = " << str << endl;
     trim(str);
     cout << "after trim  str = " << str << endl;
 
     string strOrigin = "12324342231436576abc0cba43455465767678878";
     str = strOrigin;
     cout << "before trim str = " << str << endl;
     trim_if(str, is_any_of("1234567890"));
     cout << "after trim  str = " << str << endl;
     string str2 = trim_copy_if(strOrigin, is_any_of("1234567890"));
     cout << "after trim  str2 = " << str2 << endl;
     string str3 = trim_left_copy_if(strOrigin, is_any_of("1234567890"));
     cout << "after trim  str3 = " << str3 << endl;
     string str4 = trim_right_copy_if(strOrigin, is_any_of("1234567890"));
     cout << "after trim  str4 = " << str4 << endl;
     trim_left_if(strOrigin, is_any_of("1234567890"));
     cout << "after tim_left , strOrigin = " << strOrigin << endl;
     trim_right_if(strOrigin, is_any_of("1234567890"));
     cout << "after tim_right, strOrigin = " << strOrigin << endl;
     return 0;
 }

注意trim是一系列的函數,有最普通的默認去空格的trim, 也有指定去什么的trim_if, trim_left_if, 這是直接在參數指定的string上操作,也有把結果單獨生成一個string的trim_copy_if, trim_left_copy_if

 

boost庫在unix下的安裝文檔, http://www.boost.org/doc/libs/1_52_0/more/getting_started/unix-variants.html, 只需要簡單的執行腳本就行了,會編譯鏈接生成相應的庫,且用頭文件拷到相關的目錄, 我自己在運行那個./bootrap腳本的時候開始老不成功,后來 google了一下是因為其要運行的 tools/..../build.sh沒有 chmod +x


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM