STL之sstream的用法

说在前面:

库定义了三种类:istringstream、ostringstream和stringstream,分别用来进行流的输入、输出和输入输出操作。另外,每个类都有一个对应的宽字符集版本。注意,使用string对象来代替字符数组。这样可以避免缓冲区溢出的危险。而且,传入参数和目标对象的类型被自动推导出来,即使使用了不正确的格式化符也没有危险。

使用时必须加上#include<sstream>

  • stringstream 对象用于输入一行字符串,以 空格 为分隔符把该行分隔开来

    #include <iostream>
    #include <stack>
    #include <sstream>
    using namespace std;
    int main()
    {
    string str= "hello world I am very happy!";
    stringstream sstream(str); //sstream<<
    while (sstream)
    {
    string substr;
    sstream>>substr;
    cout << substr <<" "; //也可vec.push_back(substr);
    }
    return 0;
    }
    // 输出详解:
    hello world I am very happy!
    // 大家可能会问这有什么用,如果配上栈结构便能将这个逆序输出:
    #include <iostream>
    #include <stack>
    #include <sstream>
    using namespace std;
    int main()
    {
    string str= "hello world I am very happy !",tmp;
    stringstream sstream(str);
    stack<string> s;
    while(sstream>>tmp)
    {
    s.push(tmp);
    }
    while(!s.empty())
    {
    cout<<s.top();
    s.pop();
    if(s.size()!=0)
    cout<<" ";
    }
    cout<<endl;
    return 0;
    }
    // 输出结果:
    ! happy very am I world hello
  • 类型转换

    利用stringstream进行常见类型转换

    ​ (int、long、float、double、long double、long long)

/-----string转int-----/
string str= "123456789";
stringstream sstream(str);
int tmp;
sstream>>tmp;
cout<<tmp<<endl; // 输出结果123456789
/-----int转string-----/
int tmp=123456;
stringstream t;
string s;
t<<tmp;
t>>s;
cout<<s<<endl; // 输出结果123456
/-----int转char-----/
int tmp=123456;
stringstream t;
char s[10];
t<<tmp;
t>>s;
for(int i=0;i<strlen(s);i++)
cout<<s[i]; // 输出结果123456
/-----char转int-----/
stringstream t;
char s='8';
int tmp;
t<<s;
t>>tmp;
cout<<tmp;
return 0; // 输出8;
  • 利用to_string() 进行常见类型转换, 返回值为string

    函数原型:(C++11才有这个函数)

    string to_string (int val);

    string to_string (long val);

    string to_string (long long val);

    string to_string (unsigned val);

    string to_string (unsigned long val);

    string to_string (unsigned long long val);

    string to_string (float val);

    string to_string (double val);

    string to_string (long double val);

    功能:

    将数值转化为字符串。返回对应的字符串。

    例子:

  • s1=to_string(10.5);                        //double到string
    s2=to_string(123);                        //int到string
    s3=to_string(true);                     //bool到string
    #include <iostream>
    #include <stack>
    #include <sstream>
    #include <cstring>
    #include <iomanip>
    using namespace std;
    int main()
    {
    string s1,s2,s3;
    s1=to_string(10.5); //double到string
    s2=to_string(123);//int到string
    s3=to_string(true);//bool到string
    cout<<fixed<<showpoint<<setprecision(1);
    cout<<s1<<" "<<s2<<" "<<s3<<endl;
    return 0;
    }
    // 10.500000 123 1
    重复利用stringstream对象

    如果你打算在多次转换中使用同一个stringstream对象,记住再每次转换前要使用clear()方法;

    在多次转换中重复使用同一个stringstream(而不是每次都创建一个新的对象)对象最大的好处在于效率。stringstream对象的构造和析构函数通常是非常耗费CPU时间的。

    #include <iostream>
    #include <stack>
    #include <sstream>
    #include <cstring>
    using namespace std;
    int main()
    {
    stringstream stream;
    int first;
    string second;
    stream<< "456"; //插入字符串
    stream >> first; //转换成int
    cout << first << endl;
    stream.clear(); //在进行多次转换前,必须清除stream,否则第二个数据可能输出乱码
    stream << "true"; //插入bool值
    stream >> second; //提取出int
    cout << second << endl;
    return 0;
    }
    // 输出结果:
    456
    true

STL之sstream的用法的更多相关文章

  1. STL中mem_fun, mem_fun_ref用法

    1.引言 先看一个STL中for_each的用法: #include <iostream> #include <vector> #include <algorithm&g ...

  2. STL中间set具体用法!!!!

    1.关于set C++ STL 之所以得到广泛的赞誉,也被非常多人使用.不仅仅是提供了像vector, string, list等方便的容器,更重要的是STL封装了很多复杂的数据结构算法和大量经常使用 ...

  3. STL中map的用法

    map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候 ...

  4. STL——map/unordered_map基础用法

    map /multimap map是STL里重要容器之一. 它的特性总结来讲就是:所有元素都会根据元素的键值key自动排序(也可根据自定义的仿函数进行自定义排序),其中的每个元素都是<key,  ...

  5. STL中erase()的用法

    erase()是STL提供的容器中比较常用的方法之一,它的功能是删除容器中的某些元素,其中它的函数原型如下: 1.有两个参数,且参数类型都是size_t型: string& erase ( s ...

  6. STL 之 map的用法

    Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候 ...

  7. STL源代码学习--vector用法汇总

    一.容器vector 使用vector你必须包含头文件<vector>: #include<vector> 型别vector是一个定义于namespace std内的templ ...

  8. STL中bitset的用法

    终于又来写博客了 == bitset存储的是二进数位,就和一个bool性数组差不多.用法上和数组的操作方式也差不多. 每位只占一个字节,大大优化了空间,可以通过数组形式访问. bitset定义 可以用 ...

  9. STL之list容器用法

    List 容器 list是C++标准模版库(STL,Standard Template Library)中的部分内容.实际上,list容器就是一个双向链表,可以高效地进行插入删除元素. 使用list容 ...

随机推荐

  1. Java多态实现的机制

    Java提供了编译时多态和运行时多态两种多态机制.前者是通过方法重载实现的,后者是通过方法的覆盖实现的. 在方法覆盖中,子类可以覆盖父类的方法,因此同类的方法会在父类与子类中有着不同的表现形式. 在J ...

  2. 19.10.11学习日记随笔 mysql事务隔离性

    一天的感悟 学习事务的处理方式,其中反想自己学过的flask 默认是开启事务的,flask_sqlalchemy每次在提交时都是需要commit,或者失败是需要rollback回滚操作的,其实pyth ...

  3. C#委托和事件的简单实例

    委托 C#里这个委托我的理解是可以看成是一个方法模板的类型.(不过并没有找到相关的理解 比如有几个返回值,参数列表类型相同的方法,就能用同个模板类型来表示,然后实例化一个委托类型就绑定上一个或多个方法 ...

  4. JsonFormat 日期少了8个小时?还我

    JsonFormat 后日期少了8个小时什么鬼? 前言 今天测试的时候发现时间对不上,比数据库里的时间少了8个小时?测试小姐姐一顿狂轰乱炸,一点都不温柔. 什么鬼?哪里出了问题?数据库显示的是下面

  5. Array.isArray() 判断是不是数组

    var arr = new Array(); if(Array.isArray()){ console.log('yes') } else { conssole.log('no') }

  6. (转)浅析epoll – epoll例子以及分析

    原文地址:http://www.cppfans.org/1419.html 浅析epoll – epoll例子以及分析 上篇我们讲到epoll的函数和性能.这一篇用用这些个函数,给出一个最简单的epo ...

  7. Java多线程并发06——CAS与AQS

    在进行更近一步的了解Java锁的知识之前,我们需要先了解与锁有关的两个概念 CAS 与 AQS.关注我的公众号「Java面典」了解更多 Java 相关知识点. CAS(Compare And Swap ...

  8. maven如何安装oracle驱动jdbc的jar包

    一.因为oracle驱动的压缩包在maven官网上并没有提供,所以需要自己去手动下载. 二.下载安装步骤如下: (1)第一步:找到你本地的oracle驱动包所在位置: (2)在cmd中打开jar包所在 ...

  9. TCP IP Socket In C, 2e-chapter 1 Introduction

    本章是基础概念,建议补计算机网络基础,这里不全. 目录 1 网络,数据包,协议 2 关于地址(address) 2.1 IP地址格式 2.2 IPv4和IPv6共存 2.3 端口号 2.4 特殊地址 ...

  10. GO语言web框架Gin之完全指南(二)

    这篇主要讲解自定义日志与数据验证 参数验证 我们知道,一个请求完全依赖前端的参数验证是不够的,需要前后端一起配合,才能万无一失,下面介绍一下,在Gin框架里面,怎么做接口参数验证的呢 gin 目前是使 ...