【问题标题】:vector of string to istringstream字符串向量到 istringstream
【发布时间】:2018-02-25 19:25:16
【问题描述】:

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

vector<string> vec = {"apple", "banana", "dog", "cat"};
string one_str;
for (string s: vec) {
    one_str += s + " ";
}
istringstream iss(one_str);

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

【问题讨论】:

  • 这种方法有什么问题? (除非你应该使用string&amp; s 不复制)
  • @ShashwatKumar:这个问题涉及满足此要求的一种方法,但并不排除另一种更优雅的方法。
  • 萨哈,这取决于你所说的“优雅”。您可以使用向量的内容创建一个流缓冲区并将此缓冲区设置为 istringstream 对象(请参阅 ios::rdbuf (cplusplus.com/reference/ios/ios/rdbuf))。这样您就可以避免创建临时缓冲区(您的 one_str..)。

标签: c++ c++11


【解决方案1】:

您不能从任何外部源读取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-valued 迭代器)。

这里的优雅之处在于从未构造过连接的字符串(除了可能由基于stringsbufistream 读取的客户端)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-02
    • 1970-01-01
    • 2020-07-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    • 2011-03-01
    相关资源
    最近更新 更多