C++ 方便地复制std::vector<;无符号字符>;输入流(std::istream)对象的步骤

C++ 方便地复制std::vector<;无符号字符>;输入流(std::istream)对象的步骤,c++,vector,copy,istream,unsigned-char,C++,Vector,Copy,Istream,Unsigned Char,我试图使用一个第三方库中的函数,该函数需要一个输入流对象来传输二进制文件数据 签名如下: doSomething(const std::string& ..., const std::string& ..., std::istream& aData, const std::string& ..., const std::map<std::string, std::string&g

我试图使用一个第三方库中的函数,该函数需要一个输入流对象来传输二进制文件数据

签名如下:

doSomething(const std::string& ...,
          const std::string& ...,
          std::istream& aData,
          const std::string& ...,
          const std::map<std::string, std::string>* ...,
          long ...,
          bool ...);
doSomething(const std::string&…)。。。,
常量std::字符串&。。。,
标准::istream&aData,
常量std::字符串&。。。,
常数标准::映射*。。。,
长的
布尔;
因为我不能更改这个第三方库/函数,所以我必须在“我的”代码中进行调整。在调用位置,我有一个std::vector,其中包含预期将在istream对象中传递的数据。目前,我通过迭代向量并使用
向量值,将向量复制到流中;
// ...
弦流失稳;
复制(values.begin()、values.end(),
ostream_迭代器(ioss,“,”);
//剂量测定法(a、b、ioss、d、e、f、g);

您可以使用字符的
向量
作为输入流的底层缓冲区,而无需复制向量的内容:

std::vector<unsigned char> my_vec;
my_vec.push_back('a');
my_vec.push_back('b');
my_vec.push_back('c');
my_vec.push_back('\n');

// make an imput stream from my_vec
std::stringstream is;
is.rdbuf()->pubsetbuf(reinterpret_cast<char*>(&my_vec[0]), my_vec.size());

// dump the input stream into stdout
std::cout << is.rdbuf();

我看不出您希望如何写入输入流。是的,您具体如何使用相关的@BillyONeal他可能在用iostream?它继承自istream和ostream。不,等等,我对IntelliSense太信任了。它没有编译:)原因很明显……谢谢你给我指明了正确的方向`细流ss;复制(values.begin()、values.end()、ostream_迭代器(ss,“”);'很好用!指向矢量数据的指针很容易失效。然而,stringstream的临时性使其相当安全。考虑到这一点,这是一个很好的答案。这不能保证有效,也不能在VS2015上使用
std::vector<unsigned char> my_vec;
my_vec.push_back('a');
my_vec.push_back('b');
my_vec.push_back('c');
my_vec.push_back('\n');

// make an imput stream from my_vec
std::stringstream is;
is.rdbuf()->pubsetbuf(reinterpret_cast<char*>(&my_vec[0]), my_vec.size());

// dump the input stream into stdout
std::cout << is.rdbuf();
#include <iostream>
#include <vector>

#include <boost/iostreams/device/array.hpp>
#include <boost/iostreams/stream.hpp>

int main() {
    std::vector<unsigned char> my_vec;
    my_vec.push_back('a');
    my_vec.push_back('b');
    my_vec.push_back('c');
    my_vec.push_back('\n');

    // Construct an input stream from the vector.
    boost::iostreams::array_source my_vec_source(reinterpret_cast<char*>(&my_vec[0]), my_vec.size());
    boost::iostreams::stream<boost::iostreams::array_source> is(my_vec_source);

    // Dump the input stream into stdout.
    std::cout << is.rdbuf();
}