菜鸟笔记
提升您的技术认知

std::stringstream头文件及清空处理-ag真人游戏

std::stringstream 的头文件是 sstream.h,需要包含sstream 即#include

stringstream中clear函数并非清空缓存内容,需要使用str("")。

通过下面一段代码分析差异

#include
#include"mulmsginfo.pb.h"
#include
#include
using namespace std;
using namespace lgh::mulmsgtest;
#define user_list_max_value 5
int main()
{
    int initid = 1000;
    std::string initname("da bing");
    int initage = 20;
    std::shared_ptr mmsptr(new mulmsguserinfo());
    ::lgh::mulmsgtest::mulmsguserinfo_userinfo* mulptr = null;
    std::stringstream ss_name;
    for(int i=0;iadd_userinfolist();
        mulptr->set_id(initid);
        ss_name<set_name(ss_name.str());
        mulptr->set_age(initage);
        initid  ;
        ss_name.str("");//clear() is invalid
        initage  ;
    }
    std::shared_ptr outptr(mmsptr);
    ::google::protobuf::repeatedptrfield::iterator iter;
    ::google::protobuf::repeatedptrfield userlist = outptr->userinfolist();
    for(iter=userlist.begin();iter!=userlist.end();iter  )
    {
        cout<<"id : "<id()<<" ,name : "<name()<<" ,age : "<age()<

使用clear()的结果如下

test@linux:~/coding/protocolbuffer/repeatadd> g   --std=c  11 mulmsginfo.pb.cc mulmsgmain.cpp -o mulmsgexc `pkg-config --cflags --libs protobuf` -pthread
test@linux:~/coding/protocolbuffer/repeatadd> ./mulmsgexc
id : 1000 ,name : da bing0 ,age : 20
id : 1001 ,name : da bing0da bing1 ,age : 21
id : 1002 ,name : da bing0da bing1da bing2 ,age : 22
id : 1003 ,name : da bing0da bing1da bing2da bing3 ,age : 23
id : 1004 ,name : da bing0da bing1da bing2da bing3da bing4 ,age : 24

改用str("")后,结果如下

test@linux:~/coding/protocolbuffer/repeatadd> g   --std=c  11 mulmsginfo.pb.cc mulmsgmain.cpp -o mulmsgexc `pkg-config --cflags --libs protobuf` -pthread
test@linux:~/coding/protocolbuffer/repeatadd> ./mulmsgexc
id : 1000 ,name : da bing0 ,age : 20
id : 1001 ,name : da bing1 ,age : 21
id : 1002 ,name : da bing2 ,age : 22
id : 1003 ,name : da bing3 ,age : 23
id : 1004 ,name : da bing4 ,age : 24

总结

clear() 方法只是重置了stringstream的状态标志,并没有清空数据。如果需要清空数据,使用str(“”)来实现。否则,不仅结果达不到预期,而且还会无限消耗内存。

重复利用stringstream对象

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

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

一些实例

#include 
#include 
#include  
int main()
{
    std::stringstream stream;
    std::string result;
    int i = 1000;
    stream << i; //将int输入流
    stream >> result; //从stream中抽取前面插入的int值
    std::cout << result << std::endl; // print the string "1000"
}
网站地图