用例:我想爲Linux程序實現一個非常高效的發送隊列,每秒發送大量UDP數據包的速率限制流在網絡測試程序中。目前我使用的是刪除前面的元素並添加新的元素到最小堆(std :: priority_queue)
priority_queue< pair<timespec, int>,
std::vector<pair<timespec, int>>,
std::greater<pair<timespec, int>> >
程序運行正常,速度很快。但我希望能夠在一個操作中彈出隊列前面並添加一個新元素,即每個pop/emplace對只有一個重新heapify。否則,彈出窗口會重新堆砌,然後該位置會再次直接重新堆砌。
這可以用std :: make_heap,std :: push_heap和std :: pop_heap來完成嗎?或者我必須推出自己的?我當前的程序會彈出,然後在std :: priority_queue上執行emplace,這會花費'2 * O(log(N))'。
FWIW,目前的計劃是在這裏:https://github.com/alapaa/timestamping/tree/send_queue
與隊列的實際發件人是這樣的src文件: https://github.com/alapaa/timestamping/blob/send_queue/manysock/sender.cpp
該解決方案指出,作爲預先存在的重複(jxh:s answer)效果很好。我將它作爲std :: make_heap之上的一個小封裝類實現,請參閱https://github.com/alapaa/timestamping/blob/send_queue/manysock/send_queue.h –