キューを実現するクラス

CAtlListを使えば簡単にキューを作ることができる。

ここではテンプレートクラスとして作成したため、キュー化する変数の型は自由に設定できる。

■使用例
int型のキューを用意して「1 2 3 4 5」の順番でデータを追加。順番に取り出すと「1 2 3 4 5」という順でデータが取り出せる。
#include "DnpQue.h"

void	Test()
{
	int		n;
	bool	ret;
	CDnpQue<int>	cQue;

	cQue.AddData(1);		//データ追加
	cQue.AddData(2);
	cQue.AddData(3);
	cQue.AddData(4);
	cQue.AddData(5);

	do
	{
		ret = cQue.GetData(n);
		if(ret)
		{
			ATLTRACE("%d ",n);
		}
	}
	while(ret);
}


■以下が「DnpQue.h」の内容

依存環境:ATL
#pragma	once

#include "atlcoll.h"


/*!
 * \brief
 * キューテンプレートクラス
 * 
 * 先に入れたデータが先に出力される。
 * 
 * 以下のコードでは「1 2 3 4 5」が出力する。
 * \code
	int		n;
	bool	ret;
	CDnpQue<int>	cQue;

	cQue.AddData(1);		//データ追加
	cQue.AddData(2);
	cQue.AddData(3);
	cQue.AddData(4);
	cQue.AddData(5);

	do
	{
		ret = cQue.GetData(n);
		if(ret)
		{
			ATLTRACE("%d ",n);
		}
	}
	while(ret);
 * \endcode
 */
template<class VALUE>
class CDnpQue
{

public:
	CDnpQue()
	{
	}

	virtual ~CDnpQue()
	{
	}

	CAtlList<VALUE>	_listData;		//!< 保持しているキューデータ


	/*!
	 * \brief
	 * キューにデータ追加
	 * 
	 * \param	data
	 * 追加するデータ
	 * 
	 */
	void	AddData(VALUE data)
	{
		_listData.AddTail(data);
	};


	/*!
	 * \brief
	 * キューの先頭にデータ追加
	 * 
	 * \param	data
	 * 追加するデータ
	 * 
	 * \remarks
	 * 通常のキュー動作を無視して先頭にデータを挿入する。
	 * 挿入したデータは次回の CDnpQue<VALUE>::GetData(VALUE&) により取得される。
	 */
	void	AddPrimeData(VALUE data)
	{
		_listData.AddHead(data);
	};




	/*!
	 * \brief
	 * キューからデータ取得
	 * 
	 * \param[out]	data
	 * 取得したデータ
	 * 
	 * \retval	true	成功
	 * \retval	false	失敗
	 * 
	 */
	bool	GetData(VALUE& data)
	{
		if(_listData.GetCount() > 0)
			data = _listData.RemoveHead();
		else
		{
//			data = NULL;
			return	false;
		}
		return	true;
	};


	/*!
	 * \brief
	 * キューからデータ取得
	 * 
	 * \return
	 * 取得したデータ
	 * 
	 * \attention
	 * データがなかった場合に何が返るか不定になるので、この関数は使わずに
	 * CDnpQue<VALUE>::GetData(VALUE&) を利用するべき。
	 */
	VALUE	GetData(void)
	{
		VALUE	ret;
		GetData(ret);
		return	ret;
	};


	/*!
	 * \brief
	 * キューデータを見る(GetDataのように削除はしない)
	 * 
	 * \param[out]	data
	 * 取得したデータ
	 * 
	 * \retval	true	成功
	 * \retval	false	失敗
	 */
	bool	ReferData(VALUE& data)
	{
		if(_listData.GetCount() > 0)
			data = _listData.GetHead();
		else
		{
//			data = NULL;
			return	false;
		}
		return	true;
	}


	/*!
	 * \brief
	 * キューデータを見る(GetDataのように削除はしない)
	 * 
	 * \return
	 * 取得したデータ
	 * 
	 * \attention
	 * データがなかった場合に何が返るか不定になるので、この関数は使わずに
	 * CDnpQue<VALUE>::ReferData(VALUE&) を利用するべき。
	 */
	VALUE	ReferData(void)
	{
		VALUE	ret;
		ReferData(ret);
		return	ret;
	}



	/*!
	 * \brief
	 * 現在保持しているデータ数を返す
	 * 
	 * \return
	 * データ数
	 */
	int		GetSize(void)
	{
		return	(int)_listData.GetCount();
	};


	/*!
	 * \brief
	 * 現在保持している全データを削除
	 * 
	 */
	void	RemoveAll(void)
	{
		_listData.RemoveAll();
	};
};

プロジェクトファイルをダウンロード


カテゴリー「その他」 のエントリー