2

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

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

4

2 回答 2

3

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

C++ 将优先级队列建模为priority_queue容器适配器。这意味着它内部还有一些其他容器可以进行实际存储。这个容器通常是vectordeque。(需要随机访问迭代器。)默认为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()不返回被移除的元素;它只是删除和破坏它。

于 2012-04-18T23:20:27.840 回答
1

Mike 解决方案的替代方案是使用有序映射,在 STL 的情况下它只是一个map. 您可以将时间作为键,将命令作为值。根据您的情况,它可能比排队更方便。

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

multimap<time_t, Command> schedule;

schedule.insert(pair<time_t, Command>(123456, formatHDDCommand));
于 2012-04-18T23:36:52.140 回答