我正在更改一些代码以使用命令模式并将命令对象存储在队列中。这些命令需要在特定时间执行,因此我将每秒遍历列表一次以查找要执行的命令。
每个命令对象都会有一个时间,我将根据当前时间检查这个时间(在一个小阈值内)。因此,如果时间匹配,我需要从列表中删除命令对象,然后执行它。通常在任何给定时间都会有不到 10 个命令。我应该使用什么集合数据结构以及如何在迭代列表时删除命令对象?
我正在更改一些代码以使用命令模式并将命令对象存储在队列中。这些命令需要在特定时间执行,因此我将每秒遍历列表一次以查找要执行的命令。
每个命令对象都会有一个时间,我将根据当前时间检查这个时间(在一个小阈值内)。因此,如果时间匹配,我需要从列表中删除命令对象,然后执行它。通常在任何给定时间都会有不到 10 个命令。我应该使用什么集合数据结构以及如何在迭代列表时删除命令对象?
我想你想使用一个优先队列。这是一个容器,可让您拉取最高优先级的项目。在您的情况下,“更高优先级”是“首先发生”。
C++ 将优先级队列建模为priority_queue
容器适配器。这意味着它内部还有一些其他容器可以进行实际存储。这个容器通常是vector
或deque
。(需要随机访问迭代器。)默认为vector
. 所以你可以声明:
std::priority_queue<T, vector<T>, Compare> queue;
whereT
是你的元素,Compare
是一个比较两个元素的函数,如果第一个元素的优先级低于第二个T
元素,则返回。true
如果你已经operator <
为你的 type 定义了T
,它会变得更简单:
std::priority_queue<T> queue;
queue.push(item);
queue.top()
queue.pop();
注意pop()
不返回被移除的元素;它只是删除和破坏它。
Mike 解决方案的替代方案是使用有序映射,在 STL 的情况下它只是一个map
. 您可以将时间作为键,将命令作为值。根据您的情况,它可能比排队更方便。
如果允许同时执行两个命令,则应使用multimap
.
multimap<time_t, Command> schedule;
schedule.insert(pair<time_t, Command>(123456, formatHDDCommand));