我正在尝试使用自定义排序来构建一个std::set
来存储“任务”,我想知道是否有可能通过普通{{1}得到我需要的东西容器。
该集合如下:
std
std::set<Task*, CompareTasks> taskList;
有一个公开class Task
成员。
我需要什么:
double priority
在Task *
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>
来实现这一点?
答案 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所要求的:
如果容器具有等效键的元素,则插入该范围的上限。
这意味着新插入的元素将始终位于容器中已有的等效元素之后。
请注意,标准有序关联容器按非降序排序,因此如果您希望按优先级降低排序任务,则需要更改仿函数。