c++ - 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);
}
}
任何帮助将不胜感激!
解决方案
该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 * cbData
visit
推荐阅读
- onclicklistener - 如何使用 onClickListener 将按钮移动到 Android Studio 上的特定位置?
- android - Android 工作室在项目“:app”上找不到参数 [目录“libs”] 的方法 implementation()
- app-store-connect - Xcode App Store Preview, App Store Preview Video 可以在视频上加水印吗?
- flutter - Firebase 集成抖动导致 gradle 出现问题
- javascript - 尝试在react中调用render方法中的两个AI函数,但它们被异步调用
- reactjs - react-scripts and bundle - 是否所有的“需要”和“依赖项”都添加到了最终的包中?
- list - 如何在 Flutter 中使用 List Iterable 函数
- javascript - 如何在 React 组件中获得焦点元素并更改状态?
- r - 如何用正则表达式清理数据框列?
- rust - 如何独立于渲染引擎运行系统