首页 > 解决方案 > C++ 函数作为参数二分查找

问题描述

我是堆栈溢出的新手,在已经提出的问题中找不到合适的答案。

我想做的是将一个函数作为参数传递给另一个函数(二叉搜索树,中序遍历)。

template <class elemType>
void bSearchTreeType<elemType>::createList(orderedLinkedList<elemType>& listIn)
{
    this->inorderTraversal(listIn.insert);
}

这应该做的是对二叉树进行中序遍历并将每个元素插入orderedLinkedList。通过 ListIn.insert() 时,我似乎无法让它工作。

我可以让订单与传递给它的其他功能一起工作。这个函数在像这样传递给 inorder 时起作用:inOrderTraversal(update)

template <class elemType>
void update(elemType& x)
{
    x = 2 * x;
};

下面是中序遍历的定义:

template <class elemType>
void binaryTreeType<elemType>::inorder(binNodeType<elemType>* p, void(*visit) (elemType& item)) const
{
    if (p != nullptr)
    {
        inorder(p->lLink, *visit);
        (*visit)(p->info);
        inorder(p->rLink, *visit);
    }
}

任何帮助将不胜感激!

标签: c++

解决方案


insert方法实际上不是单参数 c 函数,c++ 方法有一个隐藏的第一个参数,它作为 的值传递this,在这种情况下应该是 的值listIn

实现此场景的 c++ 方法将使用 std::function 之类的访问回调,请参阅https://en.cppreference.com/w/cpp/utility/functional/function中的一些示例。您将传递一个具有()运算符的对象,而不是函数指针。对象可以根据需要包含尽可能多的内部状态。

传统的类似 c 的方法将是带有额外状态的回调,visit将是一个像两个参数的函数,并且 inorder 将接受一个它不会触及visit(void * cbData, elemType& item)的额外参数并将其传递给调用。(然后,被调用的函数可以例如将 cbData 转换为列表并调用其插入方法...)void * cbDatavisit


推荐阅读