2017-05-07 51 views
0

我正在嘗試確定用於事件調度程序的容器。我想要滿足的要求是:用於事件調度程序的STL容器

  1. 活動應該由時間進行排序,並通過獲取 調度的前面,評估事件,然後刪除 前進行評估。
  2. 可以隨時插入事件(計劃在將來隨時評估)。
  3. 如果將其他元素添加到調度程序中,應該可以有一個指向非 事件的指針。例如, 在評估當前事件時,可能還需要刪除未來事件 。關於這個未來事件的知識應該是作爲指針實現的 。
  4. 應該可以重新安排事件,例如改變他們的時間到未來的時間。

什麼樣的容器是可能的?

  1. STL隊列 - 不允許在任何地方插入的事件(例如,通過時間)。
  2. STL向量 - 將新事件插入向量可以中斷指向現有事件的指針。
  3. STL列表 - 事件在構建之後是恆定的,因此除了刪除現有事件並在稍後創建新事件之外,重新安排是不可能的。編輯:混淆STL集

還有其他的選擇嗎?我已經讀過,通常不建議您創建自己的容器(例如鏈接列表)以提高效率。

感謝您的諮詢!

編輯

從意見,另外兩個建議:

  1. STL設置 - 元素插入之後維持恆定。
  2. STL priority_queue - 取決於STL容器(載體或雙端隊列)的選擇,這可以在插入,後保存指針(雙端隊列一樣),但只有當在任一端插入。但是,插入後元素是不變的。
+0

對於要求1和2,其有趣的是你沒有探索'std :: set'和'std :: priority_queue' – WhiZTiM

+0

啊謝謝!沒有投入足夠的精力。這些容器在插入後是否保留指向現有元素的指針? – Kurt

+0

編輯:因爲'std :: priority_queue'允許你指定一個容器,它可以是STL的'std :: vector'或'std :: deque',那麼使用'std :: deque'會保留指針 – Kurt

回答

1
  1. 活動應該由時間進行排序,並通過獲取 調度的前面,評估事件,然後刪除 前進行評估。

使用一個std::priority_queuestd::set

  1. 事件可以隨時插入(計劃在將來隨時評估)。

使用一個std::priority_queuestd::set

  • 應該有可能有一個指針,如果其他元素被添加到所述調度器是不改變 一個事件。例如, 在評估當前事件時,可能還需要刪除未來事件 。關於這個未來事件的知識應該是作爲指針實現的 。
  • 使用std::set而非指針所存儲的元件,使用迭代。 They are not invalidated當一個元素從集合中刪除(迭代器除了刪除的元素)。

    1. 應該可以重新安排事件,例如,改變他們的時間到未來的時間。

    使用std::set;使用C++ 17,你可以拼接(std::list::extract)你想要的元素,修改它的優先級等,然後將它粘回(std::list::merge)。

    +0

    我不知道「合併,提取」 - 謝謝!我想這是在有序容器中處理「rescheduling」而不必構造新元素的最簡潔方法 - 是正確的嗎?或者是否存在一些「抽象/插入」操作比「抽取/插入」操作更有效的結構? – Kurt

    +1

    @Kurt,是的,這是正確的。 'extract/merge'更高效,因爲它只刪除/合併容器的內部節點。提取或合併時,您的對象保持不變。 'extract/merge'比'擦除/插入'方式更好 – WhiZTiM

    +0

    感謝您的明確答案! – Kurt