2013-10-18 62 views
0
#include <iostream> 
#include <set> 
#include <string> 
using namespace std; 

struct Client { 
    string client_id; 
    int salary; 

    // allow client to sorted by salary 
    bool operator<(const Client& rhs) const { 
     return salary < rhs.salary; 
    } 

    // expect to search on client_id but this doesn't work 
    bool operator==(const Client& rhs) const { 
     return client_id == rhs.client_id; 
    } 
};  

int main() 
{ 
    set<Client> clients; 

    clients.emplace(Client{"a001", 10}); 
    clients.emplace(Client{"a002", 20}); 

    if (clients.find(Client{"a0001", 10}) != clients.end()) // Found 
    cout << "Found\n"; 
    else 
    cout << "Not Found\n"; 

    if (clients.find(Client{"a0002"}) != clients.end()) // Not Found 
    cout << "Found\n"; 
    else 
    cout << "Not Found\n";  
    return 0; 
} 

set::find的輸出結果確實匹配this documentset::find基於容器的比較對象,該對象依次基於salary而不是client_id如何在std :: set中定義FIND和ORDER的不同標準

問題>在這種情況下,我需要根據它們的salary訂購Clients,但在搜索時我想根據client_id進行搜索。有沒有辦法解決這個問題?我想使用STL函數而不是自己寫一個循環。

+1

你的'<'操作語義不應該與'=='的語義相矛盾。你有沒有想過保持一個按工資排序的'set',還有一個[多]地圖clientid - >客戶端? – Vlad

+0

我希望有人能給我指出正確的設計理念 – q0987

+0

非常簡單:定義你需要的操作,檢查它們被調用的頻率,選擇最合適的數據結構。如果需要快速添加和按X排序,並按Y快速查找,那麼可以這樣做:您需要按X排序的列表和由Y排列的查找(即映射)。 – Vlad

回答

0

您可以使用標準算法的std ::發現

如果(找到(clients.begin(),clients.end(),客戶端{ 「A0001」,10}))!= clients.end() )//找到 cout < <「Found \ n」;