我想使用 std::function 来帮助我运行遍历 BST 并调用参数化函数的通用遍历函数。
我的困难在于参数化函数的参数不同。
因此,例如,我要概括以下三个函数(它们的参数都不同)。
//populates an array with the values in the BST by traversing the BST
void LinkedBST<T>::populate(T const * const data, size_t & I, Node *x)
{
data[i++] = x->val;
}
//insert unique values of another BST into "this" BST: traverses the other BST and inserts every value
void LinkedBST<T>::insert(Node *x)
{
insert(x->val);
}
我希望能够将它们传递到一个通用的遍历函数中,而不是为上述每个函数编写一个单独的遍历函数,例如:
void LinkedBST<T>::traverse(Node *x, auto func)
{
if(x == nullptr)
return;
traverse(x->left, func);
func( <parameters> );
traverse(x->right, func);
}
有什么办法吗?有的话可以帮我做吗?
谢谢你:)
最佳答案
通常,您需要找到一种方法来标准化所有遍历回调的签名。一种选择是使用 lambda 并利用 lambda 捕获来减少函数的参数数量。
void LinkedBST<T>::populate(T const * const data, size_t & I)
{
traverse(root, [&](Node * x) {
data[i++] = x->val;
});
}
请注意,compare
不能使用相同的遍历函数,因为您需要同时遍历两棵树。甚至不清楚 insert
应该做什么,但从评论来看,它似乎也需要同时遍历。
关于c++ - 编写一个通用的遍历函数,允许灵活地处理具有不同参数的多个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55930796/