繁体   English   中英

客户的堆排序向量,错误地传递了迭代器?

[英]Heap sorting vector of Clients, passing iterators incorrectly?

我正在开发一个程序,该程序创建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()函数上方的代码中实现。 其次,我实际上需要将比较器传递给哪个函数? (在这里,我已经将它传递给了两者,现在还不确定)。

您应该传递一个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表达式。

&代替*

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&,但是函数不能修改传递给它的对象。

首先,您要对Client而不是Client指针进行排序,其次,应该将operator()声明为const

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM