2013-05-05 58 views
1

我正在創建一個創建4個客戶端向量的程序,然後堆使用比較器類對它們進行排序(基本上按帳戶餘額排序)。之後,我只是打印出矢量中每個客戶端的訂購帳號。但是,我認爲我沒有正確實施它。首先,當我調用向量上的STL堆排序時,我明白我將比較器作爲第三個參數傳遞。我的印象是我需要用我的AccountOrder比較類的對象來調用它,但這給了我大量的錯誤。如果我把它稱作類而不是該類的一個實例,它不會給我幾乎那麼多的錯誤。什麼是正確的方法來做到這一點?客戶端堆排序矢量,錯誤地傳遞迭代器?

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

比較已經在我的代碼中實現正上方的main()函數:

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; 
} 

比較級。其次,我真的需要將比較器傳遞給哪個函數? (在這裏我已經把它傳遞給了兩者,我還不確定)。

回答

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);

簽名並不需要有常量&,但功能不能 修改傳遞給它的對象。

+0

@M M.完美,固定它。感謝您的幫助! – user2302335 2013-05-05 23:09:18

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表達式。

0

首先要排序Client,不Client指針,其次你的operator()應該聲明const

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