POCO Library需要一个用于输入的 istream 和用于输出的 ostream 以使用其 zlib 包装器压缩数据。我在 std::vector(unsigned char) 中有数据,想将此数据压缩到另一个 std::vector(unsigned char) 中。有什么简单的方法可以做到这一点吗?
最佳答案
我不知道这是最有效的方法,但作为开始,我会试试这个:
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();
}
关于c++ - 使用 POCO 压缩 vector (c++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4466102/