17
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【C++】C++で自作クラスに簡単にイテレーターを作る方法

Last updated at Posted at 2014-11-19

既知のネタだとしても泣かない!

概要

例えば情報クラスと情報を管理するクラスがあったとする。

a.cpp
class Info // 情報クラス.
{
public:
	// データの設定.
	void SetData		(int a)	{ data = a; }
	// データの取得.
	Info GetData		()		{ return data; }
private:
	int data; // なんかのデータ.
};

class InfoManager // 情報管理クラス
{
public:
	// 情報の取得.
	Info GetInfo		(int index)		{ return datas[index]; }
	// 情報の追加.
	void AddInfo		(Info a)		{ datas.push_back(a); }
	// 情報の数.
	int GetCount		()				{ return (int)datas.size(); }
private:
	std::vector<Info> datas; // なんかのデータの動的配列.
};

情報管理クラスなんか作らずstd::vectorで良くねって話は設計次第なのでさておき、
このInfoManagerに入っている全データを取得しようと思うと次のような処理になる。

a.cpp
// Infoを全部取り出してvectorで返す関数.
std::vector<Info> GetAllData( InfoManager& manager )
{
	std::vector<Info> dst;
	for(int index = 0; index < manager.GetCount(); ++index)
	{
		dst.push_back(manager.GetInfo(index));
	}
	return dst;
}

そうするとこのコードを見た一部のSTLに毒された層の人間は「イテレーターが欲しい...」ってなるけど、
真面目にイテレーターを実装すると面倒くさいので手っ取り早く追加する方法がこの記事。

typedefでイテレーターを作る

a.cpp
class InfoManager // 情報管理クラス
{
public:
	// iteratorをtypedefする
	typedef std::vector<Info>::iterator iterator;
	typedef std::vector<Info>::const_iterator const_iterator;

	/* 以下省略 */
};

vectorのbeginとendをぱくってbeginとendを用意する

a.cpp
class InfoManager // 情報管理クラス
{
public:
	// iteratorをtypedefする
	typedef std::vector<Info>::iterator iterator;
	typedef std::vector<Info>::const_iterator const_iterator;

	// begin, end
	iterator begin(){ return datas.begin(); }
	const_iterator begin() const { return datas.begin(); }
	iterator end(){ return datas.end(); }
	const_iterator end() const { return datas.end(); }

	/* 中略 */

private:
	std::vector<Info> datas; // なんかのデータの動的配列.
};

できた

やったね!

a.cpp
std::vector<Info> GetAllData( InfoManager& manager )
{
	for(auto& a : manager)
	{
		dst.push_back(a);
	}
	return dst;
}
17
19
7

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?