【问题标题】:STL containers for event scheduler事件调度器的 STL 容器
【发布时间】:2023-03-03 22:19:02
【问题描述】:

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

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

哪些容器是可能的?

  1. STL 队列 - 不允许在任何地方插入事件(例如按时间)。
  2. STL 向量 - 将新事件插入向量中会破坏指向现有事件的指针。
  3. STL 列表 - 事件在构建后是恒定的,因此除了删除现有事件然后稍后创建新事件之外,无法重新安排。 编辑:将此与STL集混淆。

还有其他选择吗?我读过一般不建议为了提高效率而创建自己的容器(例如链表)。

感谢您的建议!

编辑

来自 cmets,还有两个建议:

  1. STL 集 - 插入后元素保持不变。
  2. STL priority_queue - 根据选择的 STL 容器(vector 或 deque),这可以在插入后保留指针(deque 确实如此),但只有在任一端插入。但是,插入后元素是不变的。

【问题讨论】:

  • 对于要求 1 和 2,有趣的是您没有探索 std::setstd::priority_queue
  • 啊,谢谢!没有付出足够的努力。这些容器在插入后是否保留指向现有元素的指针?
  • 编辑:因为std::priority_queue允许你指定一个容器,它可以是来自STL的std::vectorstd::deque,那么使用std::deque会保留指针
  • 我没有真正看到std::list 的问题。创建事件后如何常量
  • @Kurt std::deque 仅在向前面或后面添加/删除指针时保留指针,而不是在中间。

标签: c++ events stl


【解决方案1】:
  1. 事件应按时间排序,并通过获取 调度器的前面,评估事件,然后删除 前面。

使用std::priority_queuestd::set

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

使用std::priority_queuestd::set

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

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

  1. 应该可以重新安排事件,例如将时间更改为未来时间。

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

【讨论】:

  • 我不知道merge,extract - 谢谢!我想这是在有序容器中处理“重新调度”而不需要构建新元素的最干净的方法——对吗?或者是否存在某种“在幕后”比extract/insert 操作更有效的结构?
  • @Kurt,是的,这是正确的。 extract/merge 效率更高,因为它只删除/合并容器的内部节点。提取或合并时,您的对象保持不变。 extract/mergeerase/insert 好很多
猜你喜欢
  • 2017-10-21
  • 1970-01-01
  • 2011-07-24
  • 2021-07-30
  • 2011-02-07
  • 2012-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多