POCO Library需要一个istream用于输入,而另一个用于输出的ostream用它的zlib包装来压缩数据。我有一个std :: vector(unsigned char)数据,并想将这些数据压缩到另一个std :: vector(unsigned char)中。有没有简单的方法来做到这一点?用POCO压缩矢量(C++)
1
A
回答
2
我不知道,这是最有效的方式,但作为一个开始我想试试这个:
typedef unsigned char uc;
typedef vector<uc> v;
void Doit(const v& in, v& out)
{
ostringstream outStream;
DeflatingOutputStream compressor(outStream, DeflatingStreamBuf::STREAM_GZIP);
copy(in.begin(), in.end(), ostream_iterator<uc>(compressor));
compressor.close();
string outStr(outStream.str());
out.assign(outStr.begin(), outStr.end());
}
我怀疑这将数据复制两次,不必要的。首先,调用ostringstream :: str()生成一个副本,然后std :: vector :: assign()创建一个副本。
@Alf P. Steinbach有一个很好的建议 - 使用Boost流适配器。如果您有boost::iostreams::filtering_ostream
可供您使用,您可以试试这个:
typedef unsigned char uc;
typedef vector<uc> v;
void Doit(const v& in, v& out)
{
filtering_ostream outStream(back_inserter(out));
DeflatingOutputStream compressor(outStream, DeflatingStreamBuf::STREAM_GZIP);
std::copy(in.begin(), in.end(), ostream_iterator<uc>(compressor));
compressor.close();
outStream.flush();
}
2
您可以使用正常的istream
和ostream
对象,并使用方法their streambuf
s将流的内部缓冲区设置为向量的内部缓冲区。
在这种情况下,您将不得不确保接收输出的矢量具有足够的可用空间。由于ostream会直接写入缓冲区,因此不会自动调整大小。
最有可能提供流适配器。如果没有,那么最有可能的是Boost。阅读文档。 – 2010-12-16 23:47:53