矢量字符串到istringstream

时间:2018-02-25 19:25:16

标签: c++ c++11

我想使用来自字符串向量的内容填充istringstream对象。有一种优雅的方式来做到这一点?我现在正在做以下事情,这不太好:

"\"

请注意,我想填充istringstream而不是stringstream或ostringstream

1 个答案:

答案 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
};

通过添加xsgetnseekoffseekposshowmanyc中的一个或多个,当然可以提高效率和功能。也可以使其通用(不仅在字符类型上,而且可以通过接受任何string值的迭代器)。

此处的优雅之处在于,实际上没有构造任何连接的字符串(可能是客户端基于istreamstringsbuf读取的客户端除外)。