簡體   English   中英

字符串到istringstream的向量

[英]vector of string to istringstream

我想用字符串向量中的內容填充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

您不能使istringstream從任何外部源讀取:它總是復制,甚至是單個字符串。 但是,您可以通過創建自己的streambuf類並從指向其實例的指針中創建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一個或多個來提高效率和showmanyc 也可以使其通用(不僅在字符類型上,而且可以通過接受任何string值的迭代器)。

這里的優雅之處在於,實際上沒有構造任何串聯的字符串(也許由基於stringsbufistream讀取的客戶端stringsbuf )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM