【问题标题】:Why can't I use this parameter for Compare of std::sort()?为什么我不能将此参数用于 std::sort() 的比较?
【发布时间】:2015-12-30 02:04:49
【问题描述】:

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

== 渲染列表.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;
}

这里的问题是我正在尝试使用&lt;algorithm&gt;std::sort 函数的比较参数来告诉它如何排序列表(通过距相机位置的距离),但是我用于在我将其compare() 函数用作参数之前,需要实例化比较。

可以在以下位置找到类似于我正在尝试做的示例:cplusplus.com 编译时出现以下错误:

renderlist.cpp:在成员函数“ObjectList RenderList::getOrderedObjectList()”中:renderlist.cpp:32:49:错误: 没有匹配函数调用'sort(std::vector::iterator, std::vector::iterator, )' std::sort(temp.begin(), temp.end(), rlc.compare); ^

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

【问题讨论】:

  • 从比较类中移除数据成员和构造函数开始。将实例传递给排序函数。
  • @Cheersandhth.-Alf:数据成员和构造函数有什么问题?
  • @Cheers 和 hth。 - Alf:我发现将比较函数重命名为 operator()(Object* obj1, Object* obj2) 并将 RLC 结构的实例传递给 sort 可以完美地完成这项工作。感谢您的帮助。
  • @LightnessRacesinOrbit:除了支持 OP 的一些混乱之外,它们没有任何用途。当它们被删除时,这种混乱有望减少。
  • @Cheersandhth.-Alf:您似乎误解了代码。数据成员和构造函数绝对没有错。比较器是“在提供的两个对象中,哪个对象离最远?”.

标签: c++


【解决方案1】:

这不是比较器的工作方式。将您的 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())
);

【讨论】:

  • @Cheers 感谢您不要将您的个人风格选择强加于我的答案!
  • @Lighness:写this-&gt; 在模板之外只是愚蠢的,它会向读者灌输坏习惯。
  • @Cheersandhth.-Alf:你有权发表你的意见,我有权不分享!将您的个人风格选择强加于其他人的答案是不好的形式。或者我应该通过你的答案并重写所有那些愚蠢的auto main() -&gt; int...:P
  • @LightnessRacesinOrbit:纯粹出于好奇,为什么经常使用this-&gt; 会经常被人反对?我从 Java 中养成了这个习惯,是否值得摇晃它以使我的代码更具可读性?我倾向于使类数据成员与构造函数参数具有相同的名称,所以这就是我继续在 C++ 中使用this-&gt; 的原因。
  • @Harrand:好吧,如果你正确地初始化你的成员,你不需要在那里使用this-&gt;,无论它们是否与ctor参数具有相同的名称。至于其余的……我不知道。有时this-&gt; 的反对者更喜欢匈牙利风格的m_ 前缀;有时this-&gt; 的反对者根本不喜欢前缀。似乎没有任何一致的、广泛同意的立场。我通常会尽可能在自己的代码中避免使用this-&gt;,但不会在演示示例中使用。
猜你喜欢
  • 2019-10-23
  • 1970-01-01
  • 2013-01-13
  • 2011-04-07
  • 1970-01-01
  • 1970-01-01
  • 2021-11-19
相关资源
最近更新 更多