使用多重映射的待办事项列表
有序任务列表(或待办事项列表)是一个常见的计算应用程序。正式地说,它是按优先级排序的任务列表,以相反的数值顺序排序。
你可能会被诱惑使用 priority_queue 来实现这一点,因为顾名思义,它已经按优先级(逆数值)顺序排序。priority_queue 的缺点是它没有迭代器,因此很难在不将项目推入和弹出队列的情况下对其进行操作。
对于这个食谱,我们将使用多重映射来实现有序列表。多重映射关联容器保持项目的顺序,并且可以使用逆迭代器访问,以获得正确的排序顺序。
如何做到这一点…
这是一个简短且简单的食谱,它初始化了一个多重映射并按逆序打印它。
我们从多重映射的类型别名开始:
using todomap = multimap<int, string>;
```
我们的 todomap 是一个具有 int 键和 string 有效载荷的多重映射。
我们有一个小型实用函数,用于按逆序打印 todomap:
void rprint(todomap& todo) {
for(auto it = todo.rbegin(); it != todo.rend(); ++it) {
cout << format("{}: {}\n", it->first, it->second);
}
cout << '\n';
}
这使用逆迭代器打印 todomap。
main() 函数非常简短:
int main() {
todomap todo {
{1, "wash dishes"},
{0, "watch teevee"},
{2, "do homework"},
{0, "read comics"}
};
rprint(todo);
}
我们使用任务初始化 todomap。请注意,任务没有特定的顺序,但它们在键中具有优先级。rprint() 函数将按优先级顺序打印它们。
输出如下所示:
$ ./todo
2: do homework
1: wash dishes
0: read comics
0: watch teevee
待办事项列表按优先级顺序打印,正如我们需要的那样。
它是如何工作的…
这是一个简短且简单的食谱。它使用多重映射容器来保存优先级列表的项目。
唯一的技巧在 rprint() 函数中:
void rprint(todomap& todo) {
for(auto it = todo.rbegin(); it != todo.rend(); ++it) {
cout << format("{}: {}\n", it->first, it->second);
}
cout << '\n';
}
注意逆迭代器 rbegin() 和 rend()。不可能改变多重映射的排序顺序,但它确实提供了逆迭代器。这使得多重映射的行为完全符合我们对优先级列表的需求。