1

我正在开发一个程序,该程序创建一个包含 4 个客户端的向量,然后使用比较器类对它们进行堆排序(本质上是按它们的帐户余额排序)。之后,我只是打印出向量中每个客户的有序帐号。但是,我认为我没有正确实施它。首先,当我在向量上调用 STL 堆排序时,我知道我将比较器作为第三个参数传递。我的印象是我需要用我的 AccountOrder 比较器类的对象来调用它,但这给了我很多错误。如果我在 Class 而不是该类的实例上调用它,它不会给我带来几乎一样多的错误。这样做的正确方法是什么?

int main()
{
    AccountOrder f;

    vector<Client> list;

    Client client1(345.88, "Charlie");
    Client client2(249.12, "Rashesh");
    Client client3(442.90, "Michael");
    Client client4(543.74, "Mary");

    list.push_back(client1);
    list.push_back(client2);
    list.push_back(client3);
    list.push_back(client4);

    make_heap(list.begin(), list.end(), f);
    sort_heap(list.begin(), list.end(), f);

    for(int i = 0; i < list.size(); i++) 
        cout << list[i].getAccountBalance();

    system("pause");
    return 0;
}

比较器类:

class AccountOrder 
{
    public:
    bool operator()(Client * a, Client * b) 
    {
        return a->getAccountBalance() > b->getAccountBalance();
    };
};

比较器已在 main() 函数上方的代码中实现。其次,我实际上需要将比较器传递给哪个函数?(这里我已经将它传递给两者,我还不确定)。

4

3 回答 3

0

你应该传递一个类型的对象AccountOrder。但是,您operator()传递给的签名错误std::make_heap。它应该采用const引用参数,而不是指针:

bool operator()(const Client& a, const Client& b) 
{
    return a.getAccountBalance() > b.getAccountBalance();
};

您应该注意,您不必使用仿函数执行此操作。您可以简单地拥有一个具有适当签名的函数并将其传递给std::make_heap. 或者在 C++11 中,只需使用 lambda 表达式。

于 2013-05-05T22:05:57.307 回答
0

&用而不是做比较器*

class AccountOrder 
{
    public:
    bool operator()(const Client &a, const Client &b) const
    {
        return a.getAccountBalance() > b.getAccountBalance();
    };
};

 

make_heapsort_heap

比较函数的签名应该等同于以下内容:

bool cmp(const Type1 &a, const Type2 &b);

签名不需要有 const &,但函数不能修改传递给它的对象。

于 2013-05-05T22:06:20.763 回答
0

首先,您正在排序Client,而不是Client指针,其次您operator()应该声明const

class AccountOrder 
{
    public:
    bool operator()(const Client& a, const Client& b) const
    {
        return a.getAccountBalance() > b.getAccountBalance();
    };
};
于 2013-05-05T22:06:36.070 回答