我正在更改一些代码以使用命令模式,并将命令对象存储在队列中。这些命令需要在特定时间执行,因此我将每秒迭代一次列表以查找要执行的命令。
每个命令对象都会有一个时间,我将根据当前时间(在一个小阈值内)检查此时间。因此,如果时间匹配,我需要从列表中删除命令对象,然后执行它。通常在任何给定时间将有不到10个命令。我应该使用什么样的集合数据结构,如何在迭代列表时删除命令对象?
答案 0 :(得分:2)
我想你想使用priority queue。这是一个容器,可以让您拉出最高优先级的项目。在您的情况下,“更高优先级”是“先发生”。
C ++将优先级队列建模为priority_queue
容器适配器。这意味着其中有一些其他容器可以进行实际存储。此容器通常为vector
或deque
。 (需要随机访问迭代器。)默认为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));