既知のネタだとしても泣かない!
概要
例えば情報クラスと情報を管理するクラスがあったとする。
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;
}