2010-12-16 64 views
1

POCO Library需要一个istream用于输入,而另一个用于输出的ostream用它的zlib包装来压缩数据。我有一个std :: vector(unsigned char)数据,并想将这些数据压缩到另一个std :: vector(unsigned char)中。有没有简单的方法来做到这一点?用POCO压缩矢量(C++)

+0

最有可能提供流适配器。如果没有,那么最有可能的是Boost。阅读文档。 – 2010-12-16 23:47:53

回答

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

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

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