gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 02:18:25 28 4
gpt4 key购买 nike

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

== 渲染列表.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;
}
== 渲染列表.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: In member function 'ObjectList RenderList::getOrderedObjectList()': renderlist.cpp:32:49: error:    no matching function for call to 'sort(std::vector::iterator, 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())
);

关于c++ - 为什么我不能将此参数用于 std::sort() 的比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34521961/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com