gpt4 book ai didi

c++ - 我如何递归搜索项目的列表列表,获得 "closest"匹配项

转载 作者:太空宇宙 更新时间:2023-11-03 10:37:20 25 4
gpt4 key购买 nike

我有一个类“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)

最佳答案

使用 breadth-first search .当您访问不等于查询值的节点​​时,您将该节点推到队列的后面。首先处理队列前面的节点。您找到的第一个匹配项将是最接近根的匹配项。

Class* Class::findItem(const std::string& n) const {
std::list<Class>::const_iteratior i;
std::queue<Class*> q;
q.push(this);
while (!q.empty()) {
Class *c = q.front(); q.pop();
if (c->name() == n) return c;
for(i=c->_members.begin(); i!=c->_members.end(); ++i)
q.push(i);
}
return NULL;
}

关于c++ - 我如何递归搜索项目的列表列表,获得 "closest"匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/758041/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com