c – 是否有更有效的方法从流中设置std :: vector?

前端之家收集整理的这篇文章主要介绍了c – 是否有更有效的方法从流中设置std :: vector?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
目前,我设置了std :: vector< char>的值.来自std :: ostringstream如下:
void
foo(std::vector<char> &data,std::stringstream &stream) {
  data = std::vector<char>(stream.str().begin(),stream.str().end());
}

我想知道是否有更有效的方法在C中使用STL或者我在这里给出的方法是否合适?我会更好地使用std :: stringstream吗?

解决方法

您的方法调用未定义的行为. stream.str()返回一个字符串by-value,也就是一个临时字符串.你接受一个临时的开始迭代器和另一个的结束迭代器,创建一个无效的范围.

将流转换为容器的一种方法是使用公共迭代器接口:

#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.

另一种方法是缓存返回的std :: string对象:

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

猜你在找的C&C++相关文章