質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

Q&A

2回答

523閲覧

visualstudioソースヘッダーリソースファイルについて

piyota

総合スコア7

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

0グッド

0クリップ

投稿2018/01/05 05:31

#質問
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() ) );
}
}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

cppファイルの最初に出てくる以下の文はどういった意味でしょうか。

huffmancodingクラスのコンストラクターとデストラクターの定義です。
中身が何もないので、「インスタンスの初期化と破棄の際に必要な特別な処理はないです」ということだと思います。

必要なのでしょうか。

必要だろうと思います。コメントアウトしてコンパイル・リンクするとhuffmancodingクラスのコンストラクターとデストラクターがどこにもないのでリンクエラーになると思います。

ところでC++の基本知識をもう少し仕入れてからプログラムを書いた方がよいと思います。コンストラクターとかデストラクターというよりクラスがどんなものかといった点なども曖昧なのではないですか?だれかが書いたコードを見るのはよいと思いますが、見るにはそれなりの前提知識が必要ですよ?前提知識なしにコードを見ても得るものは少ない気がします。

投稿2018/01/05 06:09

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

cppファイルの最初に出てくる以下の文はどういった意味でしょうか。

必要なのでしょうか。

c++

huffmancoding::huffmancoding(void)
{
}

huffmancoding::~huffmancoding(void)

{
}

C++の言語の基礎をまずやってください。 コンストラクタやデストラクタを知らないようでは、これ以上の説明をしてもお互い無駄な時間を過ごすことになるだけです。 また、cppファイルの先頭がこのコードということは、クラスの定義はヘッダーファイルに書かれているはずです。C++のコードを読むのであれば、ヘッダーファイルから読み始めたほうが良いです。 それから、Visual Studioなら、関数を右クリックしてメニューから「定義を表示」を選択すれば、定義されているところにジャンプして表示することができます。こういう機能を使えば検索も楽になると思います。

投稿2018/01/05 08:03

編集2018/01/05 08:06
PineMatsu

総合スコア3579

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問