最小堆定時器

最小堆(Min Heap)是一種特殊的堆,其中任何節點的關鍵字都不會大於其父節點的關鍵字。最小堆可以用來實現一個優先級佇列,其中隊首元素總是最小的。最小堆也被稱為先進先出(FIFO)堆,因為它們按照插入的順序保留元素。

最小堆可以用來實現一個定時器,其中每個元素對應一個到期時間。當添加一個新的定時器時,它會被插入到堆中,並且堆會保持最小堆的特性。當堆中的某個定時器到期時,它會被移除,並且堆會重新調整以保持最小堆的特性。

以下是一個簡單的C++最小堆定時器實現示例:

#include <iostream>
#include <vector>
#include <algorithm>

template <typename T>
class MinHeapTimer {
private:
    struct TimerNode {
        T time;
        std::function<void()> callback;
    };

    std::vector<TimerNode> m_heap;
    size_t m_size;

    void swap(size_t i, size_t j) {
        TimerNode tmp = m_heap[i];
        m_heap[i] = m_heap[j];
        m_heap[j] = tmp;
    }

    void siftDown(size_t start) {
        size_t i = start;
        size_t j = 2 * i + 1;

        while (j < m_size) {
            if (j + 1 < m_size && m_heap[j + 1].time < m_heap[j].time) {
                ++j;
            }

            if (m_heap[i].time <= m_heap[j].time) {
                break;
            }

            swap(i, j);
            i = j;
            j = 2 * i + 1;
        }
    }

    void siftUp(size_t end) {
        size_t i = end;
        size_t j = i / 2;

        while (j > 0 && m_heap[j].time < m_heap[i].time) {
            swap(j, i);
            i = j;
            j = i / 2;
        }
    }

public:
    MinHeapTimer() : m_size(0) {}

    void addTimer(const T& time, const std::function<void()>& callback) {
        m_heap.emplace_back(TimerNode{time, callback});
        siftUp(m_size++);
    }

    void removeExpiredTimers() {
        while (m_heap[0].time <= m_heap[m_size - 1].time) {
            std::swap(m_heap[0], m_heap[m_size - 1]);
            m_heap[m_size - 1].callback();
            m_size--;
            siftDown(0);
        }
    }

    size_t size() const {
        return m_size;
    }
};

int main() {
    MinHeapTimer<int> timer;

    timer.addTimer(10, []{ std::cout << "Timer 10 expired\n"; });
    timer.addTimer(5, []{ std::cout << "Timer 5 expired\n"; });
    timer.addTimer(15, []{ std::cout << "Timer 15 expired\n"; });

    for (int i = 0; i < 10; ++i) {
        timer.removeExpiredTimers();
    }

    return 0;
}

這個示例中,MinHeapTimer 類實現了一個最小堆定時器。addTimer 方法用來添加一個新的定時器,removeExpiredTimers 方法用來移除所有過期的定時器。main 方法中,我們添加了三個定時器,然後調用了 removeExpiredTimers 方法 10 次,這會導致第一個和第二個定時器被移除,因為它們已經到期。

請注意,這個示例假設 T 是一個可以進行比較的類型,例如 intstd::chrono::steady_clock::time_point。如果你的類型不支持比較,你可能需要定義一個比較函數來比較到期時間。