假设我有一堂课Foo。它包含一个Foo类型的向量。如何编写一个循环来迭代foo中的向量并不断迭代子向量,直到我们达到向量为空的水平
class Foo
{
Foo();
std::vector<Foo> foos;
}
我可以这样做来迭代它,但是我如何能够递归地遍历原始向量内的foo对象中的向量,直到达到向量为空的水平?
Foo f;
if( !f->foos.empty() )
{
std::vector<Foo>::const_iterator itr;
for ( itr = f.foos.begin(); itr!=f.foos.end(); ++itr )
{
}
}
答案 0 :(得分:8)
使用递归:
class Foo
{
Foo();
std::vector<Foo> foos;
void iterate()
{
std::vector<Foo>::const_iterator itr;
for ( itr = foos.begin(); itr!=foos.end(); ++itr )
{
// do stuff breadth-first
(*itr).iterate();
// do stuff depth-first
}
}
}
答案 1 :(得分:2)
使用队列:
std::deque<Foo> q;
q.push_back(f);
while (!q.empty()) {
Foo curr = q.back();
typedef std::vector<Foo>::iterator iter;
iter end = curr.foos.end();
for(iter it = curr.foos.begin(); it != end; ++it) {
if(!it->empty()) {
q.push_back(*it);
continue;
}
// do stuff with *it
}
q.pop_back();
}
答案 2 :(得分:0)
您的Foo
个对象构成了树数据结构。您可以将任何从根到某个节点的路径表示为std::stack<Foo*>
,以跟踪您在树中的位置。使用这个想法和深度优先搜索,您可以执行访问所有Foo
对象的操作,而无需使用递归。