命令模式队列按时间排序?

时间:2012-04-18 23:17:21

标签: c++ queue command-pattern

我正在更改一些代码以使用命令模式,并将命令对象存储在队列中。这些命令需要在特定时间执行,因此我将每秒迭代一次列表以查找要执行的命令。

每个命令对象都会有一个时间,我将根据当前时间(在一个小阈值内)检查此时间。因此,如果时间匹配,我需要从列表中删除命令对象,然后执行它。通常在任何给定时间将有不到10个命令。我应该使用什么样的集合数据结构,如何在迭代列表时删除命令对象?

2 个答案:

答案 0 :(得分:2)

我想你想使用priority queue。这是一个容器,可以让您拉出最高优先级的项目。在您的情况下,“更高优先级”是“先发生”。

C ++将优先级队列建模为priority_queue容器适配器。这意味着其中有一些其他容器可以进行实际存储。此容器通常为vectordeque。 (需要随机访问迭代器。)默认为vector。所以你可以声明:

std::priority_queue<T, vector<T>, Compare> queue;

其中T是您的元素,Compare是一个比较两个T元素的函数,如果第一个元素的优先级低于第二个元素,则返回true。如果您为类型operator <定义T,则会更简单:

std::priority_queue<T> queue;
  • 将项目放入队列:queue.push(item);
  • 获取最高优先级元素:queue.top()
  • 删除队列的顶部项目:queue.pop();

请注意,pop()不会返回已删除的元素;它只是移除并破坏它。

答案 1 :(得分:1)

迈克解决方案的另一种选择是使用有序地图,如果STL只是map。您可以将时间作为键和命令保持为值。根据您的情况,它可能比队列更方便。

如果允许同时执行两个命令,则应使用multimap

multimap<time_t, Command> schedule;

schedule.insert(pair<time_t, Command>(123456, formatHDDCommand));