开端 |
以前一直认为 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.
需要提前设置缓冲大小, 比前者弱一点.
支持相当有限但非常强力的正则表达式, 完爆前者.
看到这, 聪明的你是不是已经猜到结果了呢.
逆袭 |
事实上, 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可以支持完整的正则表达式...
完爆sprintf, sscanf....
stringstream vs sprintf, sscanf.
时间: 2024-11-25 19:41:58