我有一个std::list<MyObject*> objectList
容器需要在以下场景中进行排序和维护:
- 每个对象都有一个提供成本的特定字段(例如浮点值)。该成本值用于比较两个对象,就好像它们是浮点数一样
- 集合必须是有序的(升序),并且必须快速找到新插入元素的正确位置。
- 可以删除最低元素(就成本而言),也可以更新几个任意定位元素的成本。然后必须尽可能快地重新排序列表,利用其已经排序的特性。
我可以使用任何其他 stl 容器/机制来允许三个行为属性吗?它非常类似于堆,我认为 usingmake_heap
可能是对列表进行排序的好方法。我需要一个指针容器,因为还有其他几个依赖这些指针的数据结构。
那么如何选择一个更好的容器,它也对指针友好并允许通过查看指向类型的比较运算符进行排序?
澄清:我需要一个最适合场景的 stl 容器,并且可以成功地包装指针或引用。(例如,我简要地读到std::set
容器可能是一个很好的候选者,但我没有使用它的经验)。
当前的实现,基于以下答案:
struct SHafleEdgeComparatorFunctor
{
bool operator()(SHEEdge* lhs, SHEEdge* rhs)
{
return (*lhs) < rhs;
}
};
std::multiset<SHEEdge*, SHafleEdgeComparatorFunctor> m_edges;
当然,SHEEdge
数据结构有一个重载的运算符:
bool operator<(SHEEdge* rhs)
{
return this->GetCollapseError() < rhs->GetCollapseError();
}