0

是的,我知道这是一个重复的问题,我已经知道我正在寻找的 anwser 在这里:

按对象的属性对对象向量进行排序

但是,我在将其转换为我自己的代码时遇到了问题。我正在查看上述问题中的这段代码片段:

struct SortByX
{
    bool operator() const(MyClass const& L, MyClass const& R) {
        return L.x < R.x;
    }
};

std::sort(vec.begin(), vec.end(), SortByX();

我不明白的是MyClass const & L, 和 代表什么MyClass const & R。而且我没有掌握如何将其应用于我的代码。

为了提供更多细节,我将 3 个排序方法放入具有 ( string, double, double, double, bool) 参数的对象向量的包装类中。总体目标是vectorstringbool和 3 个双打中的任何一个来排序。

这是我拥有的最新版本:

void StationVector::sortByGrade(int kindOfGas) {
struct SortByGrade {
    int kindOfGas;

    SortByGrade(int kindOfGas) :
            kindOfGas(kindOfGas) {
    }

    bool operator()(GasStation const &L, GasStation const & R) const {
        return L.getPrice(kindOfGas) < R.getPrice(kindOfGas);
    }
};

std::sort(localStations.begin(), localStations.end(),
        SortByGrade(kindOfGas));
}

该行SortByGrade(kindOfGas))给了我以下错误:

调用 `sort(__gnu_cxx::__normal_iterator >>, __gnu_cxx::__normal_iterator >>, model::StationVector::sortByGrade(int)::SortByGrade)' 没有匹配函数

4

2 回答 2

2

SortByX是一个二元谓词函子。二进制谓词意味着它接受两个参数并返回一个布尔值。Functor 意味着它的实例是可调用的。例如:

MyClass a = ....;
MyClass b = ....;
SortByX comp;
bool flag = comp(a,b); // call this SortByX instance with two MyClass instances

现在,std::sort将在内部使用您传递它的实例的副本,SortByX以便执行对该std::vector<MyClass>向量进行排序所需的元素之间的比较。

std::vector<MyClass> v;
// fill the vector with MyClass objects
std::sort(v.begin(), v.end(), SortByX()); // sort the vector using a SortByX instance for comparisons

注意:为此,二元谓词必须实现严格的弱排序

于 2013-02-10T22:45:00.920 回答
1

我不明白的是 MyClass const & L 和 MyClass const & R 代表什么。

L和,在这种情况下,是正在比较的容器中R的两个项目(您的类的实例),在小于运算符的左侧和右侧。它们通过 const-reference 传入。MyClassLR

而且我没有掌握如何将其应用于我的代码。

在您自己的bool operator() const(MyClass const& L, MyClass const& R)问题中,您需要比较您在问题中提到的三个数据成员,重要的是要记住应用严格的弱排序true如果L是“小于”则返回Rfalse否则返回。


随着问题的更新......

看起来您希望将变量传递给您的functor。您可以通过创建一个构造函数来做到这一点,例如这个SSCCE在此处编译):

#include <algorithm>
#include <vector>

namespace model {

struct GasStation
{
    double getprice(int kindOfGas) const
    {
        return kindOfGas;
    }
};

struct StationVector
{
    std::vector<GasStation> localStations;

    struct SortByGrade
    {
        int kindOfGas_;
        SortByGrade(int kindOfGas)
            :kindOfGas_(kindOfGas)
        {
        }

        bool operator() (GasStation const &L, GasStation const & R) const
        { 
            // You'll need other comparisons here, but this is a good start...
            return L.getprice(kindOfGas_) < R.getprice(kindOfGas_); 
        }
    };

    void sortByGrade(int kindOfGas) 
    {
        std::sort(localStations.begin(), localStations.end(), SortByGrade(kindOfGas));
    }
};

}

int main()
{
    model::StationVector sv;
    sv.sortByGrade(0);
}

注意:const限定符出现在参数列表之后,而不是方法名称之后。

另外,请不要将整个方法放在一行中,这会使阅读变得非常困难。

于 2013-02-10T22:47:53.053 回答