用于事件调度程序的STL容器

时间:2017-05-07 21:39:10

标签: c++ events stl

我正在尝试决定用于事件调度程序的容器。我想要满足的要求是:

  1. 事件应按时间排序,并通过获取进行评估 调度程序的前端,评估事件,然后删除 前面。
  2. 可以随时插入事件(计划在将来的任何时间进行评估)。
  3. 应该可以指向不是的事件 如果将其他元素添加到调度程序,则会更改。例如, 在评估当前事件时,可能还需要 删除未来的事件。关于这个未来事件的知识应该是 实现为指针。
  4. 应该可以重新安排事件,例如把时间改成未来的时间。
  5. 哪些容器可能?

    1. STL队列 - 不允许在任何地方插入事件(例如按时间)。
    2. STL vector - 在向量中插入新事件可能会破坏指向现有事件的指针。
    3. STL列表 - 事件在构造后是常量,因此除非删除现有事件,然后在以后创建新事件,否则无法重新安排。 编辑:将此与 STL设置相混淆。
    4. 还有其他选择吗?我已经读过,通常不建议您创建自己的容器(例如链接列表)以提高效率。

      感谢您的建议!

      修改

      从评论中,还有两点建议:

      1. STL set - 插入后元素不变。
      2. STL priority_queue - 取决于STL容器(vector或deque)的选择,这可以在插入后保留指针(deque确实),但仅在两端插入时。但是,插入后元素是不变的。

1 个答案:

答案 0 :(得分:1)

  
      
  1. 事件应按时间排序,并通过获取进行评估   调度程序的前端,评估事件,然后删除   前面。
  2.   

使用std::priority_queuestd::set

  
      
  1. 可以随时插入事件(计划在将来的任何时间进行评估)。
  2.   

使用std::priority_queuestd::set

  
      
  1. 应该可以指向一个不是的事件   如果将其他元素添加到调度程序,则会更改。例如,   在评估当前事件时,可能还需要   删除未来的事件。关于这个未来事件的知识应该是   实现为指针。
  2.   

使用std::set而不是指向存储元素的指针,使用迭代器。 They are not invalidated从集合中删除元素时(迭代器除了已删除的元素除外)。

  
      
  1. 应该可以重新安排事件,例如把时间改成未来的时间。
  2.   

使用std::set;使用C ++ 17,您可以拼接(std::list::extract)您想要的元素,修改它的优先级,然后将其粘贴回(std::list::merge)。