Boost學習筆記 -- 字串與文字處理
阿新 • • 發佈:2019-02-14
lexical_cast
使用lexical_cast
#include <boost/lexical_cast.hpp>
using namespace boost;
sample
int x = lexical_cast< int >( "100" );
long y = lexical_cast< long >( "2000" );
float pai = lexical_cast< float >( "3.14159e5" );
double e = lexical_cast< double >( "2.71828" );
string str = lexical_cast< string >( 456 ); // "456"
string str1 = lexical_cast< string >( 0.618 ); // "0.6179999999999999"
string str2 = lexical_cast< string >( 0x10 ); // "16"
注意,要轉換成數字的字串只能有數字和小數點,不能出現字母(表示指數的e/E除外)或其他非數字字元,例如不能是”123L”, “0x100”。如果需要更高階的格式控制,則需要使用std::stringstream或者boost::format。
format
使用format
#include <boost/format.hpp>
using namespace boost;
sample
cout << format("%s:%d+%d=%d\n") % "sum" % 1 % 2 % ( 1 + 2 ); // sum:1+2=3
format fmt( "(%1% + %2%) * %2% = %3%\n" );
fmt % 2 % 5;
fmt % ( ( 2 + 5 ) * 5 );
cout << fmt.str(); // (2 + 5) * 5 = 35
格式化語法
- %05d: 輸出寬度為5的整數,不足位用0填充;
- %-8.3f: 輸出左對齊,總寬度為8,小數位3位的浮點數;
- % 10s: 輸出10位的字串,不足位用空格填充;
- %05X: 輸出寬度為5的大寫16進位制整數,不足位用0填充;
format fmt( "%05d\n%-8.3f\n% 10s\n%05X\n" );
cout << fmt % 62 % 2.236 % "123456789" % 48;
result:
00062
2.236
123456789
00030
format的效能
printf()不進行型別檢查,直接向stdout輸出,因此它的速度非常快,而format較printf()做了很多安全檢查的工作,因此效能略差,速度上要慢很多。
如果很在意format的效能,可以先建立const format物件,然後複製這個物件進行格式化操作,這樣比直接使用format物件能夠提高速度:
const format fmt( "%10d %020.8f %010X %10.5e\n" );
cout << format( fmt ) % 62 % 2.236 %255 % 0.618;
string_algo
string_algo是一個非常全面的字串演算法庫,可以在不使用正則表示式的情況下處理大多數字符串相關問題。
用法
string_algo庫位於boost::algorithm,但被using語句引入到了名字空間boost
#include <boost/algorithm/string.hpp>
using namespace boost;
sample
string str( "readme.txt" );
if( ends_with( str, "txt" ) ) {
cout << to_upper_copy( str ) + " UPPER" << endl;
assert( ends_with( str, "txt" ) );
}
replace_first( str, "readme", "followme" );
cout << str << endl;
vector<char> v( str.begin(), str.end() );
vector<char> v2 = to_upper_copy( erase_first_copy( v, "txt" ) );
for( auto ch : v2 ) {
cout << ch;
}
result:
README.TXT UPPER
followme.txt
FOLLOWME.
string_algo概述
符合boost.range要求的容器都可以被string_algo處理。
string_algo庫中的演算法命名遵循了標準庫的慣例,使用不同的擴充套件來區分不同的版本,規則是:
- 字首i:有此字首表明演算法是大小寫不敏感的,否則是大小寫敏感的;
- 字尾_copy: 表明演算法不變動輸入,返回處理結果的複製,否則演算法改變輸入;
- 字尾_if:表明演算法需要一個作為判斷式的謂詞函式物件,否則使用預設的判斷標準;
string_algo提供的演算法分為5大類:
- 大小寫轉換;
- 判斷式與分類;
- 修剪;
- 查詢與替換;
- 分割與合併;