带函数 ptr 的 BST,如何添加额外的参数?

BST with function ptr, How to add in extra argument?

有没有办法在 BST 中将额外的参数传递给我的函数指针?我正在尝试使用 BST inOrder 从 map 中获取值。此 BST 将存储地图的密钥。

地图将作为一个以日期+时间为关键字的数据库。每个 BST 将被创建以存储每年的日期和时间,并保存到另一个包含所有 bst 的地图(bstMap)中。 bstMap 将使用年份作为键。

BST inOrder 函数 ptr.

#ifndef BST_H
#define BST_H

#include<iostream>

using namespace std;

template <class T>
class Node.
{
    public:
        T m_key;
        Node<T> *m_left;
        Node<T> *m_right;

};

template <class T>
class BST
{
    typedef void(*funcPtr)(T &);

    public:
        BST();
        void Insert(T key);
        void Delete();
        void InOrder(void(*funcPtr)(T &)) const;
        void PreOrder(void(*funcPtr)(T &)) const;
        bool Search(T key);
        T MaxValue();
        bool IsEmpty() const {return m_root == nullptr;}
        void DeleteTree();

    private:
        Node<T> *m_root;

    protected:
        Node<T> *Insert(Node<T>* node, T key);
        Node<T> *Search(Node<T>* node, T key);
        void InOrder(Node<T>* node, void (*funcPtr)(T &)) const;
        void PreOrder(Node<T>* node, void (*funcPtr)(T &)) const;
        void DeleteTree(Node<T>* node);
        Node<T>* MaxValue(Node<T>* node);

};

template<class T>
BST<T>::BST(){
    m_root = nullptr;
}

template<class T>
void BST<T>::InOrder(Node<T>* node, void(*funcPtr)(T &)) const
{
    if (node != nullptr)
    {
        InOrder(node-> m_left, funcPtr); //recursive call for node left

        funcPtr(node-> m_key);

        InOrder(node->m_right, funcPtr);
    }
}

template<class T>
 void BST<T>::InOrder(void(*funcPtr)(T &)){
  InOrder(m_root, funcPtr);
 }

这行代码是从 main.cpp 调用的,它将用户输入的年份传递到地图 return 存储所有相关键的 bst。

void GetData(string& year, map<string, BST<string>>& bstMap)
{

    BST<string> bstKey = bstMap[year];
    bstKey.InOrder(&GetTotal);

}

这就是我卡住的地方..

void GetTotal(string& key) <- how do i reference my database map here?
{
    cout<< key <<endl;
}

如果您想访问 BST 模板 class 之外的变量(例如地图),那么我建议您将模板更改为以下内容(假设 m_rootBST<T>的成员变量,并且它是树的根):

template<class T, class Fn>
void BST<T>::InOrder(Fn funcPtr) const
{
    InOrder(m_root, fn); 
}

template<class T, class Fn>
void BST<T>::InOrder(Node<T>* node, Fn funcPtr) const
{
   if (node)
   {
      InOrder(node-> m_left, funcPtr); //recursive call for node left
      funcPtr(node-> m_key);
      InOrder(node->m_right, funcPtr);
   }
}

然后通过这种方式,您可以传递一个了解地图的函数对象或 lambda。在下面的例子中,使用了 lambda 函数:

void GetData(string& year, map<string, BST<string>>& bstMap)
{
    BST<string> bstKey = bstMap[year];
    bstKey.InOrder([&](std::string& key) { std::cout << bstMap[key] << "\n"; });
}

上面提供了一个 lambda 来捕获传入的 map 参数。