Сжатие вектора с помощью POCO (c ++) - PullRequest
1 голос
/ 17 декабря 2010

Библиотека POCO требует istream для ввода и ostream для вывода для сжатия данных с помощью оболочки zlib. У меня есть данные в std :: vector (unsigned char) и я хотел бы сжать эти данные в другой std :: vector (unsigned char). Есть ли простой способ сделать это?

Ответы [ 2 ]

2 голосов
/ 17 декабря 2010

Я не знаю, что это самый эффективный способ, но для начала я бы попробовал это:

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();
}
2 голосов
/ 17 декабря 2010

Вы можете использовать обычные istream и ostream объекты и использовать pubsetbuf метод их streambuf s , чтобы установить внутренний буфер потока ввнутренний буфер вектора.

В этом сценарии вы должны убедиться, что вектор, получающий выходные данные, имеет достаточно свободного места.Поскольку ostream будет писать напрямую в буфер, автоматическое изменение размера не произойдет.

...