-3

我尝试<为类重载运算符并按如下方式调用该函数:

bool Edge::operator<(Edge const & e) const {
    return this->GetCost() < e.GetCost();
}

在主()

sort(edge_set.begin(),edge_set.end());

此外,我还尝试为 main.cpp 中定义的对象编写一个简单的比较器函数并尝试调用sort(),但再次失败:

bool edge_comparator(Edge& e1, Edge& e2){
    return (e1.GetCost() < e2.GetCost());
}

在主()

sort(edge_set.begin(),edge_set.end(), edge_comparator);

对于我尝试过的那些,我得到一个编译错误。我在这里做错了什么?如何对对象集进行排序?

4

2 回答 2

3

std::set是已排序的关联容器,因此无法重新排序。排序标准应用于构造和元素插入。

编辑:你有一组Edge指针。如果您希望根据您自己的标准对其进行排序,您可以使用仿函数的类型实例化 an ,该仿函数在一对指针std::set之间执行小于比较作为第二个模板参数:Edge

struct EdgePtrCmp
{
  bool operator()(const Edge* lhs, const Edge* rhs) const
  {
    return lhs->GetCost() < rhs->GetCost();
  }
}

然后

std::set<Edge*, EdgePtrCmp> s;

编辑 2:问题已再次更改,因此尚不清楚它是否处理一组指针。

于 2013-04-10T12:35:59.073 回答
1

两个问题。首先,您不能对集合中的元素重新排序。它们的排序标准是在构造时确定的,它是对象的基本部分。为了实现 O(log n) 的查找、插入和删除,这是必要的,这是std::set. 默认情况下,它将使用std::less<Edge>,它应该调用你的operator<. 但是你也可以使用你的edge_comparator函数,像这样:

std::set<Edge, bool(*)(Edge&,Edge&)> edge_set(edge_comparator);

其次,std::sort只能用于随机访问迭代器或更好的迭代器,并且std::set迭代器是双向的。

于 2013-04-10T12:38:04.033 回答