Это может потребовать небольшого объяснения, поэтому, пожалуйста, держись со мной.
У меня есть класс "Class", который имеет член std :: list, я хочу найти этот список / дерево для предмета, в частности предмет с определенным именем.
Основное представление моего класса выглядит следующим образом.
#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 () возвратил «ближайший» элемент к тому, из которого производился поиск.
Например, если это мое дерево, где каждая буква представляет один уровень в иерархии списка, а каждое число представляет значение элемента. Я хочу, чтобы findItem (3) возвращал B (3), а не C (3).
A(1)
|
----------------------------------
B(2) B(3)
| |
--------------------- -----
C(3) C(4) C(4)
| |
---------------- ----------
D(5) D(6) D(7) D(5) D(6)
Если я не объясняю себя ясно, пожалуйста, дайте мне знать, и я постараюсь.