2010-12-16 83 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會直接寫入緩衝區,因此不會自動調整大小。