【发布时间】:2013-03-14 20:56:09
【问题描述】:
我有一个std::list<MyObject*> objectList 容器,我需要在以下场景中对其进行排序和维护:
- 每个对象都有一个提供成本(例如浮点值)的特定字段。该成本值用于比较两个对象,就好像它们是浮点数一样
- 集合必须是有序的(升序),并且必须快速找到新插入元素的正确位置。
- 可以删除最低元素(就成本而言),也可以更新几个任意定位元素的成本。然后列表必须尽快重新排序,利用其已经排序的特性。
我可以使用任何其他 stl 容器/机制来允许三个行为属性吗?它非常类似于堆,我认为使用make_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();
}
【问题讨论】:
-
对我来说,听起来您已经回答了自己的问题:堆似乎是解决您问题的完美结构。
-
@NPE:我想问题就变成了; “是否有任何 STL(或 Boost)容器类似于堆?”...
-
@NPE: ty,我编辑了问题并为这个案例添加了说明。
标签: c++ data-structures stl