C++学习(十二)stringstream istringstream ostringstream

95 篇文章 15 订阅

C++的字符串读写流

istringstream类用于执行C++风格的字符串流的输入操作。 

ostringstream类用于执行C++风格的字符串流的输出操作。 

strstream类同时可以支持C++风格的串流的输入输出操作。

1、空格会成为字符串参数的内部分界。

2、要使用上述类,必须包含 sstream 头文件。

注意:由于stringstream构造函数会特别消耗内存,似乎不打算主动释放内存(或许是为了提高效率),但如果你要在程序中用同一个流,反复读写大量的数据,将会造成大量的内存消耗,因些这时候,需要适时地清除一下缓冲 (用 stream.str("") )。

另外不要企图用 stream.str().resize(0),或 stream.str().clear() 来清除缓冲,使用它们似乎可以让stringstream的内存消耗不要增长得那么快,但仍然不能达到清除stringstream缓冲的效果,内存的消耗还在缓慢的增长!

clear()这个名字让很多人想当然地认为它会清除流的内容。实际上,它并不清空任何内容,它只是重置了流的状态标志而已!状态标志位一共有4种, goodbit, eofbit, failbit, badbit。流经过一次<<、>>操作后,此时stringstream会为其设置一个eofbit的标记位,标记其为已经到达eof。查文档得知, 当stringstream设置了eofbit,任何读取eof的操作都会失败,同时,会设置failbit的标记位,标记为失败状态,后面的str()、>>操作都会失败。一般用于多次<<、>>流操作之间。

至于stream.flush(),则根本就起不到任何作用,主要起刷新输出流的作用,比如输出到文件、内存等位置,会清空缓冲区,但是不会改变缓冲区大小。
 

#include <iostream>
#include <sstream>
#include <string>
#include <stdlib.h>
int main(int argc, char** argv)
{    
    std::stringstream strStream;
    for (int i = 1; i < 100; ++i)
    {
        strStream.clear();
        strStream << i;
        std::string numStr;
        strStream >> numStr;
        std::cout<<numStr<<" ";
    }
    std::cout<<std::endl;
    printf("size=%d\n", strStream.str().capacity());
}

#include <iostream>
#include <sstream>
#include <string>
#include <stdlib.h>
int main(int argc, char** argv)
{    
    std::stringstream strStream;
    for (int i = 1; i < 100; ++i)
    {
        //strStream.clear();
        strStream << i;
        std::string numStr;
        strStream >> numStr;
        std::cout<<numStr<<" ";
    }
    std::cout<<std::endl;
    printf("size=%d\n", strStream.str().capacity());
}

这里的15是默认缓冲区大小。

 

 

有关resize和reserve

resize():改变当前容器内含有元素的数量(size()),eg: vector<int>v; v.resize(len);v的size变为len,如果原来v的size小于len,那么容器新增(len-size)个元素,元素的值为默认为0.当v.push_back(3);之后,则是3是放在了v的末尾,即下标为len,此时容器是size为len+1;

reserve():改变当前容器的最大容量(capacity),它不会生成元素,只是确定这个容器允许放入多少对象,如果reserve(len)的值大于当前的capacity(),那么会重新分配一块能存len个对象的空间,然后把之前v.size()个对象通过copy construtor复制过来,销毁之前的内存;

只有当容器内元素数(size)大于capcity时,容器才会改变地址。

 

vector<int> v;

当v.resize(len)中len>v.capacity(),则v中的size和capacity均设置为len;

当v.resize(len) 中len<=v.capacity(),则v中的size设置为len,而capacity不变; 如果此时len<v.size(),那么多出的那些对象(v[len], v[len+1]…)会被销毁,v[0]-v[len-1]仍保留在原地。

当v.reserve(len)中len>v.capacity(),则v中的capacity变为len,size不变,size只跟容器中元素数和resize有关(v.resize(len)将原来不存在的元素设为初值0)。

当v.reserve(len)中len<=v.capacity(),则v中的capacity不变,size不变,即不对容器做任何改变。

总结:size可能改变capacity,但capacity不会改变size;

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值