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"
}