• C++ stringstream学习


    转自:https://blog.csdn.net/hanjing_csdn/article/details/79922660

    https://zhuanlan.zhihu.com/p/44435521

    1.介绍 

    当我们需要在程序中使用字符串和数字数据互相转换的时候,可以使用stringstream类,

    • 通过运算符 ”<<“ 将数据传递给 stringstream 对象;
    • 通过调用stringstream 类的函数str() 将对象所包含的内容赋给一个string对象;
    • 可以方便的以流运算符<<将数值以各种数据(字串、数值)写入stringstream对象,且不用担心写越界等问题;

    2.使用 

    #include <iostream>
    #include <sstream>
    int main()
    {
        // default constructor (input/output stream)
        std::stringstream buf1;
        buf1 << 7;//将int转换为stringstream对象
        int n = 0;
        buf1 >> n;
        std::cout << "buf1 = " << buf1.str() << " n = " << n << '\n';
     
        // input stream
        std::istringstream inbuf("-10");
        inbuf >> n;//可以将stringstream对象转换为int
        std::cout << "n = " << n << '\n';
     
        // output stream in append mode (C++11)
        std::ostringstream buf2("test", std::ios_base::ate);//如果不设置第二个参数的话,就会变为1est
        buf2 << '1';
        std::cout << buf2.str() << '\n';
    }

    输出:

    buf1 = 7 n = 7
    n = -10
    test1 

    转换过程:

    • 数字 -> stringstream对象 -> string 
    • string -> stringstream对象 -> 数字
    #include <sstream>
    #include <iostream>
    int main()
    {
        int n;
     
        std::istringstream in;  // could also use in("1 2")
        in.str("1 2");
        in >> n;
        std::cout << "after reading the first int from \"1 2\", the int is "
                  << n << ", str() = \"" << in.str() << "\"\n";
     
        std::ostringstream out("1 2");
        out << 3;
        std::cout << "after writing the int '3' to output stream \"1 2\""
                  << ", str() = \"" << out.str() << "\"\n";
        out << 4;
        std::cout << "after writing the int '4' to output stream \"1 2\""
                  << ", str() = \"" << out.str() << "\"\n";
        out << 5;
        std::cout << "after writing the int '5' to output stream \"1 2\""
                  << ", str() = \"" << out.str() << "\"\n";
    
        std::ostringstream ate("1 2", std::ios_base::ate);
        ate << 3;
        std::cout << "after writing the int '3' to append stream \"1 2\""
                  << ", str() = \"" << ate.str() << "\"\n";
        return 0;
    }

    输出为:

    after reading the first int from "1 2", the int is 1, str() = "1 2"
    after writing the int '3' to output stream "1 2", str() = "3 2"//插入时如果不设置,默认从头开始插入
    after writing the int '4' to output stream "1 2", str() = "342"
    after writing the int '5' to output stream "1 2", str() = "345"
    after writing the int '3' to append stream "1 2", str() = "1 23"

    >>操作也默认从头开始输出,<<默认从头开始输入。(感觉好反直觉。。)

    3.效率

    转自:https://blog.csdn.net/mijichui2153/article/details/118154341

    此链接的实验中,+=和append操作,效率都高,但是stringstream由于是类,频繁地创建和销毁代价较高,涉及到内存分配、对象构造和销毁。如果循环中需要频繁使用stringstream对象的话,可以共用一个,在使用中clear和清空:

    void* test_stringstream(void * arg)
    {
        stringstream oss;
        for(int i=0;i<10000;i++)
        {
            oss.clear();这仅仅置流标记
            oss.str("");/这是才是真正清空操作
            oss << i;
        }
    }

    stringstream不会主动释放内存,stream.str("")清除缓冲。

  • 相关阅读:
    git切换仓库 小记
    修改prometheus默认端口,修改grafana默认端口
    Redisson报错
    Windows IDEA Community 报错
    Debouncer防抖代码
    IDEA通用配置
    Jackson通用工具类
    SpringBoot接入两套kafka集群
    博客园什么时候有的高低贵贱制度???
    致已经逝去的2020和已经到来的2021
  • 原文地址:https://www.cnblogs.com/BlueBlueSea/p/16703551.html
Copyright © 2020-2023  润新知