21xrx.com
2024-06-03 07:00:07 Monday
登录
文章检索 我的文章 写文章
C++类模板经典例题
2023-06-27 22:55:59 深夜i     --     --
C++ 类模板 经典 例题

C++类模板经典例题是C++编程语言中非常重要的一个知识点。类模板是一种可以生成多个具体实例的类描述。其基本思想是通过使用参数模板生成不同的具体类型,从而避免代码重复,提高代码的可重用性。在这篇文章中,我们将对C++类模板经典例题进行介绍,帮助大家更好地理解该知识点。

C++类模板经典例题可以分为两类:第一类是常见的实现缓存的队列;第二类是实现经典的二叉查找树。下面我们将逐一介绍这两类例题的具体实现方法。

第一类例题实现缓存的队列。该例题需要我们实现一个有序队列,其中元素可以根据其优先级进行排序,并且具有缓存的功能。缓存的功能是指,如果有一个元素已经存在于队列中,则将其移动到队列的首部,而不是向队列中添加一个新元素。在这种情况下,需删除队列末尾的元素。

代码的实现方法如下:

 c++

template <typename T>

class Queue {

private:

  struct Node {

    T data;

    Node *next;

  };

  Node *head;

  Node *tail;

  std::map<T, Node *> hmap;

  const int kSize;

public:

  Queue(int size) : kSize(size)

    head = nullptr;

    tail = nullptr;

  

  bool add(const T &data) {

    auto iter = hmap.find(data);

    if (iter != hmap.end()) {

      auto node = iter->second;

      if (node == head)

        return true;

      

      if (node == tail)

        tail = node->next;

      

      auto prev = head;

      while (prev->next != node)

        prev = prev->next;

      

      prev->next = node->next;

      node->next = head;

      head = node;

      return true;

    }

    if (hmap.size() == kSize) {

      hmap.erase(tail->data);

      auto to_delete = tail;

      tail = tail->next;

      delete to_delete;

    }

    auto node = new Node nullptr ;

    if (!head)

      head = node;

      tail = node;

    

    else

      node->next = head;

      head = node;

    

    hmap[data] = node;

    return true;

  }

};

第二类例题实现经典的二叉查找树。该例题需要我们实现一个二叉查找树,可以进行插入、查找和删除等操作,并且可以对查找结果进行统计。在该例题中,可以使用模板参数来指定元素类型的比较函数和统计函数。

代码实现方法如下:

 c++

template <typename T, typename TCompare = std::less<T>, typename TStat = int (*)(const T &)>

class BST {

private:

struct Node {

T value;

Node *left;

Node *right;

int count;

Node(T v) : value(v), left(nullptr), right(nullptr), count(1) {}

};

Node *root;

TCompare compare_func;

TStat stat_func;

Node *insert(Node *node, const T &value) {

if (!node) {

return new Node(value);

}

if (compare_func(value, node->value)) {

node->left = insert(node->left, value);

}

else {

node->right = insert(node->right, value);

}

node->count = 1 + (node->left ? node->left->count : 0) + (node->right ? node->right->count : 0);

return node;

}

Node *search(Node *node, const T &value) const {

if (!node || !compare_func(node->value, value) && !compare_func(value, node->value))

return node;

if (compare_func(value, node->value)) {

return search(node->left, value);

}

return search(node->right, value);

}

Node *getmin(Node *node) const {

while (node && node->left)

node = node->left;

return node;

}

Node *remove_min(Node *node) {

if (!node->left)

return node->right;

node->left = remove_min(node->left);

node->count = 1 + (node->left ? node->left->count : 0) + (node->right ? node->right->count : 0);

return node;

}

Node *remove(Node *node, const T &value) {

if (!node)

return nullptr;

if (compare_func(value, node->value)) {

node->left = remove(node->left, value);

}

else if (compare_func(node->value, value)) {

node->right = remove(node->right, value);

}

else {

Node *left = node->left;

Node *right = node->right;

delete node;

if (!right)

return left;

Node *min = getmin(right);

min->right = remove_min(right);

min->left = left;

min->count = 1 + (min->left ? min->left->count : 0) + (min->right ? min->right->count : 0);

return min;

}

node->count = 1 + (node->left ? node->left->count : 0) + (node->right ? node->right->count : 0);

return node;

}

public:

BST() : root(nullptr), compare_func(TCompare()), stat_func(TStat()) {}

BST(TCompare comp) : root(nullptr), compare_func(comp), stat_func(TStat()) {}

BST(TCompare comp, TStat stat) : root(nullptr), compare_func(comp), stat_func(stat) {}

virtual ~BST() {

clear(root);

}

bool insert(const T &value) {

root = insert(root, value);

return true;

}

bool erase(const T &value) {

if (search(value) == nullptr)

return false;

root = remove(root, value);

return true;

}

Node *search(const T &value) const {

return search(root, value);

}

Node *getmin() const {

return getmin(root);

}

Node *getmax() const {

Node *node = root;

while (node && node->right)

node = node->right;

return node;

}

int count(const T &value) const {

Node *node = search(root, value);

return node ? node->count : 0;

}

void clear() {

clear(root);

root = nullptr;

}

void clear(Node *node) {

if (node) {

clear(node->left);

clear(node->right);

delete node;

}

}

};

综上所述,C++类模板经典例题是C++编程语言中非常重要的一部分。通过学习和实践,大家将能够更好地掌握类模板的使用技巧,提高代码的重用性和可维护性。希望本篇文章对大家有所帮助,有兴趣的读者可以进行实验和实践。

  
  
下一篇: C++命名空间std

评论区

{{item['qq_nickname']}}
()
回复
回复