【问题标题】:Compressing vector with POCO (c++)用 POCO (c++) 压缩向量
【发布时间】:2010-12-16 22:43:41
【问题描述】:

POCO Library 需要 istream 输入和 ostream 输出以使用其 zlib 包装器压缩数据。我在 std::vector(unsigned char) 中有数据,并想将此数据压缩到另一个 std::vector(unsigned char) 中。有什么简单的方法可以做到这一点?

【问题讨论】:

  • 最有可能提供流适配器。如果没有,那么 Boost 很可能会这样做。阅读文档。

标签: c++ stl poco


【解决方案1】:

我不知道这是最有效的方法,但作为开始我会试试这个:

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】:

    您可以使用普通的istreamostream 对象,并使用their streambufspubsetbuf 方法将流的内部缓冲区设置为向量的内部缓冲区。

    在这种情况下,您必须确保接收输出的向量有足够的可用空间。由于 ostream 将直接写入缓冲区,因此不会发生自动调整大小。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-18
      • 2020-05-01
      • 1970-01-01
      • 2023-03-21
      相关资源
      最近更新 更多