c++ - 编写一个通用的遍历函数,允许灵活地处理具有不同参数的多个函数

标签 c++ function data-structures binary-search-tree

我想使用 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/

相关文章:

c++ - Sphinx 插入似乎被截断但未发现错误

bash - 确定函数是否存在于 bash 中

在单独的 C 文件中调用函数

javascript - 如何在 JavaScript 中查看函数返回值

data-structures - 如何在 fortran 2003-2008 中实现链表

c++ - 数组在基本地牢爬虫中打印出多个字符

java - 使用 Java JNI 时是否可以调试核心转储?

c++ - 在 C++ 中创建/打开事件并检查它们是否被触发

c - 如何用节点N的总节点生成所有可能的树

无法从链表末尾删除节点