我在读其他人'代码和这部分让我困惑。任何人都可以向我解释*this
在这里指的是什么以及这一行(for_each(node->items.begin(), node->items.end(), *this);
)的作用是什么?这段代码来自于搜索R / R *树中的元素。我想在这里我们应该为for_each(begin,end,functor)
提供一个仿函数,但我不知道*this
是什么{在我看来是#34; node->items
&#的元素34; vector)实际上会做。
// this functor recursively walks the tree
template <typename Acceptor, typename Visitor>
struct QueryFunctor : std::unary_function< const BoundedItem, void > {
const Acceptor &accept;
Visitor &visitor;
explicit QueryFunctor(const Acceptor &a, Visitor &v) : accept(a), visitor(v) {}
void operator()(BoundedItem * item)
{
Node * node = static_cast<Node*>(item);
if (visitor.ContinueVisiting && accept(node))
{
if (node->hasLeaves)
for_each(node->items.begin(), node->items.end(), VisitFunctor<Acceptor, Visitor>(accept, visitor));
else
for_each(node->items.begin(), node->items.end(), *this);
}
}
};
答案 0 :(得分:1)
R* tree是一种R树,具有更好的查询性能(但建设成本略高)。 R树是一种包含目录(非结束节点)和叶子(结束节点)的数据结构。节点的成员bool hasLeaves
告知节点是否包含目录(hasLeaves
是false
)还是离开(hasLeaves
是true
)。目录只是递归遍历,但叶子是我们感兴趣的。
当代码调用for_each(..., *this)
时,它会为给定范围内的每个项目调用QueryFunctor::operator()(BoundedItem * item)
。 for_each
可以使用一个给定参数的函数或operator(),在这种情况下它是operator()。给定范围的元素实际上是Node*
类型,但Node
是从BoundedItem
派生的,因此参数类型匹配。这在您使用static_cast
行中提供的代码中可见,但为了更好地理解,我阅读了完整的代码here。