#質問
vusualstudio2013を使っています。
cppファイルの最初に出てくる以下の文はどういった意味でしょうか。
必要なのでしょうか。
初心者で全く分からないのですが、ご回答よろしくお願いします。
huffmancoding::huffmancoding(void)
{
}
huffmancoding::~huffmancoding(void)
{
}
#現在やりたいこと
以下のコードを使ってハフマン符号化の実装を行いたいと思っています。(c++)
コードはサンプルコードを拝借させていただいたので、あまり理解できていません。
これをcppファイルとしてコピーして実行すれば良いのでしょうか。
/// ハフマン木の節を表す構造体
template<typename T> struct HuffmanTreeNode
{
/// 子の節の添字(節番号)に対する型
typedef typename std::vector< HuffmanTreeNode<T> >::size_type size_type;
T value; /// 値
size_t count; /// 出現頻度
size_type left; /// 左の子の節番号
size_type right; /// 右の子の節番号
/* コンストラクタ */
/// 全要素を指定して構築
///
/// t 値
/// c 出現頻度
/// l,r 左右の子の節番号
HuffmanTreeNode( T t, size_t c, size_type l, size_type r )
: value( t ), count( c ), left( l ), right( r ) {}
/* メンバ関数 */
/// 節の大小関係を評価する
///
/// 自分自身が引数の節よりも小さければ true を返す。
/// 大小関係は出現頻度 count で評価する。
///
/// dest 比較対象の節
bool operator<( const HuffmanTreeNode& dest ) const
{ return( count < dest.count ); }
};
/*
MakeHuffmanTree : forest を森としてハフマン木を作成する
各節ははじめから子を持たない状態になっているものとする
戻り値として根の位置(先頭要素からの距離)を返す
/
template<typename T> typename std::vector< HuffmanTreeNode<T> >::difference_type
MakeHuffmanTree( typename std::vector< HuffmanTreeNode<T> > forest )
{
// 発生頻度によりソートする
std::sort( forest->begin(), forest->end() );
// 根の位置
typename std::vector< HuffmanTreeNode<T> >::difference_type root = 0;
// 木にする節の位置
typename std::vector< HuffmanTreeNode<T> >::size_type sz = 0;
while ( sz + 1 < forest->size() ) {
// 木にする節の位置を示す反復子
typename std::vector< HuffmanTreeNode<T> >::iterator s = forest->begin() + sz;
// 木にする二つの節を連結する親の節(これが根の節となる)
HuffmanTreeNode<T> node( T(), s->count + ( s + 1 )->count, sz, sz + 1 );
// 挿入位置を決めて親の節を登録する
typename std::vector< HuffmanTreeNode<T> >::iterator p = std::upper_bound( s + 2, forest->end(), node );
root = std::distance( forest->begin(), p ); // insert前に根の節の位置を登録しておく
forest->insert( p, node );
sz += 2;
}
return( root );
}
typedef HuffmanTreeNode<unsigned char> UCharNode; // ハフマン木の要素
typedef std::vector<UCharNode> HuffmanTree; // ハフマン木
/*
CountPalet : 画像 draw 上のピクセルに対し、各パレットの出現頻度をカウントして palet に登録する
RGB 各成分はまとめてカウンタへ登録する。
/
void CountPalet( const DrawingArea_IF& draw, std::vector<size_t> palet )
{
// 出現頻度の初期化
palet->assign( RGB::MAX + 1, 0 );
Coord<int> c;
RGB rgb;
for ( c.y = 0 ; c.y < draw.size().y ; ++( c.y ) ) {
for ( c.x = 0 ; c.x < draw.size().x ; ++( c.x ) ) {
draw.point( c, &rgb );
for ( RGB::size_type st = RGB::RED ; st < RGB::RGB_SIZE ; ++st )
++( ( *palet )[rgb[st]] );
}
}
}
/*
MakeForest : パレットの出現頻度 counter から、ハフマン木作成用の森 forest を作成する
/
void MakeForest( const std::vector<size_t>& counter, HuffmanTree forest )
{
forest->clear();
for ( std::vector<size_t>::const_iterator cit = counter.begin() ;
cit != counter.end() ; ++cit ) {
if ( *cit == 0 ) continue;
forest->push_back( UCharNode( std::distance( counter.begin(), cit ), *cit,
forest->max_size(), forest->max_size() ) );
}
}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。