具有自定义比较函子的集合,在平等的情况下可预测

时间:2014-06-15 07:22:47

标签: c++ set comparison key

我正在尝试使用自定义排序来构建一个std::set来存储“任务”,我想知道是否有可能通过普通{{1}得到我需要的东西容器。

该集合如下:

std

std::set<Task*, CompareTasks> taskList; 有一个公开class Task成员。

我需要什么:

  • 编辑:每个任务double priorityTask *
  • 中必须是唯一的
  • 任务必须按递减taskList进行排序。
  • 如果priority恰好与列表中已有task2的{​​{1}}共享,那么“先到先得”:priority必须在 task1后插入

我尝试使用仿函数:

task2

但是我插入的具有已记录的task1的任务只是...根本没有插入。因此,我怀疑class CompareTasks { public: bool operator()(Task* const& a, Task* const& b) { return a->priority < b->priority; } }; 的键是优先级本身,而不是priority中写的指针值taskList。我怎样才能检查是否是这种情况?

更显着:由于在为Task*容器创建比较仿函数时,排序必须,有没有办法只用std::set<Task*, CompareTasks>来实现这一点?

1 个答案:

答案 0 :(得分:4)

提供比较器时std::set的等效性定义为!comp(a,b) && !comp(b,a)。使用比较函数,您将无法插入具有相同优先级的两个Task *,因为它们与该定义相同。

你想要的是std::multiset - 尤其是C ++ 11 std::multiset,因为它的insert()有这个保证不包含在C ++ 03中ref;这是§23.2.4[associative.reqmts],标准表102所要求的:

  

如果容器具有等效键的元素,则插入该范围的上限。

这意味着新插入的元素将始终位于容器中已有的等效元素之后。

请注意,标准有序关联容器按非降序排序,因此如果您希望按优先级降低排序任务,则需要更改仿函数。