Is there a more efficient way to set a std::vector from a stream?

c++, ostringstream, stdvector, stl, stringstream

Solution

Your method invokes undefined behaviour. `stream.str()` returns a string by-value, aka a temporary string. You take the `begin` iterator of one temporary and the `end` iterator of the other, creating an invalid range.

One method to convert a stream to a container is to use the common iterator interface:

#include <iostream>
#include <sstream>
#include <vector>
#include <algorithm>
#include <iterator>

int main(){
  std::stringstream src("....");
  std::vector<char> dest;
  // for a bit of efficiency
  std::streampos beg = src.tellg();
  src.seekg(0, std::ios_base::end);
  std::streampos end = src.tellg();
  src.seekg(0, std::ios_base::beg);
  dest.reserve(end - beg);

  dest.assign(std::istreambuf_iterator<char>(src), std::istreambuf_iterator<char>());

  std::copy(dest.begin(), dest.end(), std::ostream_iterator<char>(std::cout));
}

Live example on Ideone.

Another method would be to cache the returned `std::string` object:

std::string const& s = stream.str();
data.reserve(s.size());
data.assign(s.begin(), s.end());

Problem

Presently, I set the value of a `std::vector<char>` from an `std::ostringstream` as follows: ``` void foo(std::vector<char> &data, std::stringstream &stream) { data = std::vector<char>(stream.str().begin(), stream.str().end()); } ``` I'm wondering if there is a more efficient way to do this with STL in C++ or whether the method I give here is considered appropriate? Would I be better off using `std::stringstream` instead?

Original source