带函数 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_root
是BST<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
参数。
有没有办法在 BST 中将额外的参数传递给我的函数指针?我正在尝试使用 BST inOrder 从 map
地图将作为一个以日期+时间为关键字的数据库。每个 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_root
是BST<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
参数。