为什么我不能将此参数用于 std::sort() 的比较?

Why can't I use this parameter for Compare of std::sort()?

本文关键字:sort 比较 std 不能 用于 参数 为什么      更新时间:2023-10-16

我正在尝试按网格位置与相机距离的升序对网格的std::向量(每个网格都有自己的变换类,因此也有位置)进行排序(预定义的Vec3)。

==renderlist.hpp==
//Includes & guard omitted
typedef std::vector<Object*> ObjectList;
class RenderList
{
public:
    RenderList(Object** objects, unsigned int numObjs, Camera& camRef);
    ObjectList getOrderedObjectList();
    void renderInOrder(Shader& master);
private:
    ObjectList unorderedList;
    Camera* cameraReference;
}
==renderlist.cpp==
struct RenderListCompare
{
    Vec3 cp;
    RenderListCompare(Vec3 camPos)
    {
        cp = camPos;
    }
    bool compare(Object* obj1, Object* obj2)
    {
        Vec3 pos1 = obj1->getTransform().getTranslate();
        Vec3 pos2 = obj2->getTransform().getTranslate();
        return (pos1.distance(cp) > pos2.distance(cp));
    }
};
RenderList::RenderList(Object** objects, unsigned int numObjs, Camera& camRef)
{
    for(unsigned int i = 0; i < numObjs; i++)
    {
        this->unorderedList.push_back(objects[i]);
    }
    this->cameraReference = &camRef;
}
void RenderList::getOrderedObjectList()
{
    ObjectList temp = this->unorderedList;
    RenderListCompare rlc(this->cameraReference->getPos());
    std::sort(temp.begin(), temp.end(), rlc.compare);
    return temp;
}

这里的问题是,我试图使用<algorithm>std::sort函数的Compare参数来告诉它如何排序列表(通过与相机位置的距离),但我用于比较的结构需要在使用其compare()函数作为参数之前实例化。

类似于我尝试做的事情的例子可以在cplusplus.com上找到我在编译时得到以下错误:

renderlist.cpp:在成员函数"ObjectList renderlist::getOrderedObjectList()"中:renderlist.cpp:32:49:错误:对"sort(std::vector::迭代器,std::vector::iterator,)"的调用没有匹配的函数std::sort(temp.begin(),temp.end(),rlc.compare);^

我的猜测是,我曾试图模仿上面的链接来实现类似的效果,但之前向结构中添加了额外的信息,这可能会导致我出现语法错误。

比较器不是这样工作的。将您的compare成员函数更改为operator()

struct RenderListCompare
{
   RenderListCompare(const Vec3& camPos)
      : cp(camPos)
   {}
   bool operator()(const Object* obj1, const Object* obj2)
   {
      Vec3 pos1 = obj1->getTransform().getTranslate();
      Vec3 pos2 = obj2->getTransform().getTranslate();
      return (pos1.distance(cp) > pos2.distance(cp));
   }
private:
   const Vec3 cp;
};

…并将RenderListCompare对象传递给std::sort,而不是自己命名成员函数。

std::sort(
   temp.begin(),
   temp.end(),
   RenderListCompare(this->cameraReference->getPos())
);