c ++"这个" for_each中的指针

时间:2015-12-21 23:31:23

标签: c++ tree this functor

我在读其他人'代码和这部分让我困惑。任何人都可以向我解释*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);
                        }
                }
        };

1 个答案:

答案 0 :(得分:1)

R* tree是一种R树,具有更好的查询性能(但建设成本略高)。 R树是一种包含目录(非结束节点)和叶子(结束节点)的数据结构。节点的成员bool hasLeaves告知节点是否包含目录(hasLeavesfalse)还是离开(hasLeavestrue)。目录只是递归遍历,但叶子是我们感兴趣的。

当代码调用for_each(..., *this)时,它会为给定范围内的每个项目调用QueryFunctor::operator()(BoundedItem * item)for_each可以使用一个给定参数的函数或operator(),在这种情况下它是operator()。给定范围的元素实际上是Node*类型,但Node是从BoundedItem派生的,因此参数类型匹配。这在您使用static_cast行中提供的代码中可见,但为了更好地理解,我阅读了完整的代码here