我正在开发一个程序,它创建一个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()函数上方的代码中实现。其次,我实际需要将哪个函数传递给比较器? (这里我把它传给了两者,我还不确定。)
答案 0 :(得分: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表达式。
答案 1 :(得分:0)
使用&
代替*
class AccountOrder
{
public:
bool operator()(const Client &a, const Client &b) const
{
return a.getAccountBalance() > b.getAccountBalance();
};
};
比较函数的签名应该等同于 以下内容:
bool cmp(const Type1 &a, const Type2 &b);
签名不需要const&amp;,但函数不能 修改传递给它的对象。
答案 2 :(得分:0)
首先,您要排序Client
,而不是Client
指针,其次,operator()
应该声明为const
。
class AccountOrder
{
public:
bool operator()(const Client& a, const Client& b) const
{
return a.getAccountBalance() > b.getAccountBalance();
};
};