メンバ std::list を持つクラス "Class" があります。そのリスト/ツリーで項目、具体的には特定の名前の項目を検索したいと考えています。私のクラスの基本的な表現は次のとおりです。
#include <list>
#include <string>
class Class {
std::string _name;
std::list<Class*> _members;
public:
Class(const std::string& name) : _name(name) {}
void addMember(Class* member) { _members.push_back(member); }
const std::string& name() const { return _name; }
const std::list members() const { return _members; }
Class* findItem(const std::string& name) const { ... }
};
Class::findItem で次のようなことができます。
Class* Class::findItem(const std::string& n) const {
std::list<Class>::const_iteratior i;
for(i=_members.begin(); i!=_members.end(); ++i)
if((*i)->name() == n) return *i;
for(i=_members.begin(); i!=_members.end(); ++i) {
Class* cls = (*i)->findItem(n);
if(cls) return cls;
}
return 0;
}
しかし、私がやりたいのは、findItem() が検索元に「最も近い」アイテムを返すことです。たとえば、これが私のツリーの場合、各文字はリスト階層の 1 つのレベルを表し、各数字はアイテムの「値」を表します。findItem(3) が C(3) ではなく B(3) を返すようにします。
あ(1) | | ---------------------------------- B(2) B(3) | | | | --------------------- ----- C(3) C(4) C(4) | | | | ---- ---------------------- D(5) D(6) D(7) D(5) D(6)