BST模板类中使用的矢量模板类

时间:2015-12-07 18:34:06

标签: c++ templates

如何处理这样的任务。我实现了BST模板类,它能够对intfloat等简单类型进行操作。现在我想实现另一个模板类Vector并在BST中为此类型添加不同的功能模板类,因为Vector类型的每个比较比较Vector长度而不仅仅是值(在这种情况下是两个值)。

bst.h

#ifndef BSTTREE_BST_H
#define BSTTREE_BST_H

template <class T> class bst {
   struct node {
       T d;
       node *l, *r;
    };
    node* root;
public:
    bst();
    ~bst();
    void freeMemory(node* bstNode);
    void insert(T x); 
    void show(); 
    void show(node* bstNode);
    int count(node* bstNode);
    node* search(T x);
    node* search(node* bstNode, T x);
    bool rmv(T x); 
};

#include "bst.cpp"
#endif //BSTTREE_BST_H

bst.cpp

#ifndef BSTTREE_BST_CPP
#define BSTTREE_BST_CPP

#include "bst.h"
#include <iostream>

template <class T>
bst<T>::bst() {}

template <class T>
bst<T>::~bst() {}

template <class T>
void bst<T>::freeMemory(bst::node *node) {}

template <class T>
void bst<T>::insert(T x){}

template <class T>
void bst<T>::show() {}

template <class T>
void bst<T>::show(node* root) {}

template <class T>
int bst<T>::count(node* root) {}

template <class T>
typename bst<T>::node* bst<T>::search(T x) {}

template <class T>
typename bst<T>::node* bst<T>::search(node* root, T x) {}

template <class T>
node* bst<T>::rmv(int value, node *parent) {}

#endif //BSTTREE_BST_CPP

我没有实现内部方法,因为它工作得很好而且不是任务。我知道这些代码中的一些内容是错误的,但我必须遵循一些规则,我认为这些规则并不是很聪明,但这不是重点。

我考虑在.h / .cpp文件中创建另一个模板类vector,并在bst.cpp中包含Vector类的标头,并仅为Vector类模板写入其他功能。 这是个好主意吗?或者有更好的方法(如果可能的话,不会更改我的代码)。怎么做?

2 个答案:

答案 0 :(得分:2)

C ++支持operator overloading,这意味着如果您坚持使用特定的比较运算符,例如*(root->l) < *(root->r),这将适用于原始类型intfloat,等

同时您可以定义自定义

bool Vector::operator<(const Vector& other) const { return this->length() < other.length(); }

这样,在比较Vector个实例时,BST模板类将正确调用指定的重载方法。

答案 1 :(得分:0)

不是为特定的vector类添加功能,而是可以尝试创建一个重载函数,在其中比较2个值,并为该函数添加第三个参数,这将是一个函数指针,你可以在vector课程中定义。

示例::

void func1(T v1, T v2, (bool) (*compare) (T, T));

T是模板类型)

您可以创建此compare函数,该函数不仅可以比较长度,还可以根据具体情况比较其他一些属性,并在func1中使用compare返回的结果。

有关函数指针How do function pointers in C work?

的更多信息