標籤:style blog color width 2014 代碼
以前一直認為 stringstream 遠不如 sprintf.
近日突然萌發了看看 stirngstream 是不是真的如我想的那麼爛
咱們來看看對比.
// stringstream.
stringstream sstream;sstream << 1 << "abcc";string str = sstream.str(); // 數字, 字串混合.
sstream << "123";
sstream >> num; // 字串轉數字.
// sprintf.
string str(512, 0);sprintf(&str[0], "%s%d", s, d);
sprintf(&str[0], "%[^a-z]%*[a-z]%[^a-z]%*[a-z]%[^\0]", "2014-asddsaqwfdsf6-qweljkhdkjfhs29");
// sscanf.
sscanf("123", "%d", &num);
從以上代碼個來做比較.
stringstream:
提供了 數字, 字串 互相轉換功能.
完美支援string, 不需要提前知道 緩衝大小.
sprintf, sscanf.
需要提前設定緩衝大小, 比前者弱一點.
支援相當有限但非常強力的Regex, 完爆前者.
看到這, 聰明的你是不是已經猜到結果了呢.
事實上, stringstream 相當強大, 只是你不知道...
咱們看看接下來的例子.
template<class T1, class T2>
inline T1 parseTo(const T2 t)
{
static stringstream sstream;
T1 r;
sstream << t;
sstream >> r;
sstream.clear();
return r;
}
int i = parseTo<int>("123");
float f = parseTo<float>("1.23");string str = parseTo<string>(123);
有沒有發現, 這種寫法既方便又優美.
stringstream 真正強大的地方還在後面..
class date {public: int year; int month; int day;};stringstream &operator<<(stringstream &sstream, const date &d){ sstream << d.year << d.month << d.day;}stringstream &operator>>(stringstream &sstream, date &d){ sstream >> d.year >> d.month >> d.day; return sstream;}
stringstream是可擴充的.
通過C++的重載運算子, 任何自訂類都可以通過stringstream轉換.
再來看一段...
sstream << "2014";
sstream << "asddsaqwfdsf6qweljkhdkjfhs29";
string str = regex_replace(sstream.str(), "[a-zA-Z]+", "-");
又舉了一個不恰當的例子.
此時 str == "2014-6-29";
自己封裝下, stringstream可以支援完整的Regex...
完爆sprintf, sscanf....