一些進階語言比如py,他們的資料類型之間的轉換,都擁有靈活而便利的特性,然而c++也提供了一些友善的輔助庫,今天來學習stringstream,字元串流在變量類型轉換中的應用,這使得程式設計的速度,大大的提高了
流的概念
說到流,最常用的就是iostream 即 input / output stream 輸入輸出流,回想我們是怎樣使用流的?
cout<<a; // 向輸出流中添加資料a
cin>>b; // 讀取輸入流的資料到b
箭頭的朝向(即移位運算符的方向)決定了資料的流向,而
cout<<a;
顯然是向輸出流中添加資料a,
cin>>b;
是讀取輸入流的資料到b
可以把流了解成一個“隊列”,最後我們添加的東西會按順序相應的被輸出,或者是變量按順序被讀取,這和我們的認知是相同的
流的弱類型
在一句 cout 裡面,我們可以輸入任意資料類型,最後他們都會恰當的被轉化到螢幕上面,這是一個好特性
那麼有沒有一種流,可以輸入字元串,輸出整數,或者是輸入整數,輸出字元串呢,這樣就可以摒棄itoa或者atoi了,答案是
stringstream
stringstream的使用
利用stringstream對象,可以靈活的讀入任意類型資料(數字類型和string),輸出任意類型資料,實作資料類型的轉化
栗子:int轉string
可以簡單地向字元流中加入資料,然後以另一類型從字元流中讀取資料,以完成轉化,string轉int同樣可以用類似的操作實作
using namespace std;
stringstream ss;
int x = 114514;
string str;
ss<<x; // 向字元流中加入 x
ss>>str; // 從字元流中以string類型的形式取資料
cout<<str<<endl;
// 代碼的執行結果是 114514
流的複用
上文提到,因為流類似隊列,一個流一旦被打開,他會儲存之前加入過的資料,稍有不慎就會因為舊的資料的影響,而導緻轉化的失敗,最好的習慣是每次複用流對象之前,調用clear方法,清空流,再加入新資料,或者是申請新的stringstream對象也是可以的
下面這個例子展示了錯誤的轉換
using namespace std;
stringstream ss;
int res;
ss<<114;
ss<<514;
ss>>res;
cout<<res<<endl;
// 運作結果:114514
用clear方法來複用流對象
運作結果:
#include <bits/stdc++.h>
using namespace std;
int main()
{
stringstream ss;
int n1;
double n2;
string n3, n4;
// string 轉 int / double
ss.clear();
ss<<"123";
ss>>n1;
ss.clear();
ss<<"456.789";
ss>>n2;
// int / double 轉string
ss.clear();
ss<<114514;
ss>>n3;
ss.clear();
ss<<1919.81;
ss>>n4;
cout<<n1<<" "<<n2<<" "<<n3<<" "<<n4<<endl;
return 0;
}