类指针向量上的std :: sort()

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类指针向量上的std :: sort()相关的知识,希望对你有一定的参考价值。

我有一个类指针std::vector<Square*> listSquares的向量。我想用类的一个属性作为键对它进行排序。这就是我正在做的事情

bool compById(Square* a, Square* b)
{
    return a->getId() < b->getId();
}

std::sort(listSquares.begin(), listSquares.end(), compById)

但编译器说:错误:没有匹配函数调用'sort(std :: vector :: iterator,std :: vector :: iterator,<unresolved overloaded function type>)'

我在这做错了什么?

答案

为了使用compById作为std::sort的参数,它不应该是成员函数。这是错的

class Square
{
    bool compById(Square* a, Square* b)
    {
        return a->getId() < b->getId();
    }
    ...
};

这个更好,

class Square
{
    ...
};

bool compById(Square* a, Square* b)
{
    return a->getId() < b->getId();
}
另一答案

你缺少的最重要的部分是比较函数的参数是const。另一种是返回类型。如果在声明函数时省略了返回类型,编译器将假定它返回int,在这种情况下这是不正确的。

当然,当你调用std::sort函数时,比较函数必须在范围内。

另一答案

您可以使用成员函数。但是您需要将其定义为静态成员函数并从类中调用它,而不是类的实例。

在函数声明之前注意static,在sort中的函数名之前注意Square::

class Square
{
    /*...*/
public:
    static bool compById(const Square* a, const Square* b)
    {
        return a->getId() < b->getId();
    }
};

main()
{
    /*...*/
    std::sort(listSquares.begin(), listSquares.end(), Square::compById);
}

以上是关于类指针向量上的std :: sort()的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 std::sort() 对指向值的向量进行排序?

如何使用单独类的属性对向量进行 std::sort [关闭]

字符串指针的排序向量

使用 std::sort 对对象向量进行排序

对空向量进行 std::sort [关闭]

从类指针向量创建成员变量向量