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