Я не знаю, что это самый эффективный способ, но для начала я бы попробовал это:
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 () делает копию.
@ Альф П. Штайнбах предложил отличное предложение - используйте Boost streamадаптеры.Если у вас есть 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();
}