一些高级语言比如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;
}