我想使用来自字符串向量的内容填充istringstream对象。有一种优雅的方式来做到这一点?我现在正在做以下事情,这不太好:
"\"
请注意,我想填充istringstream而不是stringstream或ostringstream
答案 0 :(得分:0)
您无法从任何外部来源进行istringstream
的读取:它始终会复制,即使是单个字符串也是如此。但是,可以通过创建自己的streambuf
类和指向其实例的指针making an istream
来创建从任何数据源读取的流。最低版本仅需要覆盖一种方法:
#include<streambuf>
#include<string>
#include<vector>
struct stringsbuf : std::streambuf {
stringsbuf(const std::string *b,const std::string *e) : ss(b),se(e) {}
stringsbuf(const std::vector<std::string> *v) : // pointer vs. temporaries
ss(&v->front()),se(ss+v->size()) {}
int_type underflow() override {
while(ss!=se) {
auto &s=*ss++;
if(s.empty()) continue;
char *p=const_cast<char*>(s.data());
setg(p,p,p+s.size());
return *p;
}
return traits_type::eof();
}
private:
const std::string *ss,*se; // next string to load, and past-the-end string
};
通过添加xsgetn
,seekoff
,seekpos
和showmanyc
中的一个或多个,当然可以提高效率和功能。也可以使其通用(不仅在字符类型上,而且可以通过接受任何string
值的迭代器)。
此处的优雅之处在于,实际上没有构造任何连接的字符串(可能是客户端基于istream
从stringsbuf
读取的客户端除外)。