2009年6月30日 星期二

C++ 沒有 split

C++ 沒有 split()。很多 script language 都有 split 這個好用的東西,但是 C++ 沒有,使用 boost::xpressive 我們可以用七行程式碼實作一個。
std::vector<std::string> split ( const std::string &s ) {
using namespace boost::xpressive ;
sregex_token_iterator begin( s.begin(), s.end(), +_s, -1 ), end;
std::vector<std::string> v ;
std::copy( begin, end, std::back_inserter(v) );
return std::move(v) ;
}

split ( "A B C" ) ; // ["A", "B", "C"]
split ( "A BB\tCCC\n\nDDDD" ) ; // ["A", "BB", "CCC", "DDDD"]
Python 的 split 一樣,切割字元是三種空字元 ' ', '\t', 還有 '\n',而且連續的空白會被忽略。

順帶提一下,這個函數不採用由外部傳入 std::vector<std::string>> 接收 tokens 的設計,而是用 std::move() 把結果傳出來,使用上更直覺簡單,感謝 C++0x 帶給 C++ 更強大的表述能力。