2013-07-27 66 views
0

在一些stdtemplate的參數,一個需要定義他/她自己的功能比較less(a, b)more(a, b)然後std::some_template<T, *, myComparator()>,但是爲什麼呢?爲什麼我們仍然需要我們自己定義的功能比較

+1

什麼是 「STL」? – 2013-07-27 14:17:45

+0

所有的大多數都有它們的默認比較器。 它全部在程序員的意圖 – P0W

+0

@ H2CO3我不知道該給這個詞打什麼電話,這就是爲什麼我只是稱它爲stl,對不起 – mr5

回答

5

比較器的目的是允許排序的stl容器中的對象排序。如果默認的比較器不適合容器所容納的對象類型,則只需要提供自己的比較器。

例如,如果您要製作以下struct的std :: set,那麼您需要編寫自己的比較器。

struct Person 
{ 
    std::string first_name, last_name, phone_number; 
} 

默認比較器知道如何比較數字和字符串,但它不知道如何比較Person對象。這是如何編寫自定義比較器來按last_name排序Person對象的。

struct Person_Comparator 
{ 
    bool operator()(const Person &a, const Person &b) const { 
     return a.last_name < b.last_name; 
    } 
}; 
1

又如讓讓一組具有一些不同的標準

int main() 
{ 
    //By default set will use std::less<int>() 
    //Lets make a set based on no. of 1's in binary representation of elements 

    set<int,mycomp> s; 
    for(auto i=1;i<20;i++) //Note :Duplicates 1's representation will be discarded 
     s.insert(i); 

    for(auto i:s) 
     cout<<i<< " "; //19 15 8 7 3 1 
    return 0; 
} 

以及相應的比較會像下面:

struct mycomp 
{ 
    bool operator()(const int& a, const int& b) const { 
     auto count_bits = [](long n){ 
      unsigned int c; 
      for (c = 0; n; c++) 
      n &= n - 1; 
      return c; 
     }; 
      return count_bits(a) != count_bits(b); 
     } 
}; 
0

我們仍然偶爾也需要我們自己定義的函數比較器在泛型編程中,但我們並不總是需要自己編寫:)你可以使用這個在線嚮導[http://www.xochellis.org/genericdataordering/wizard .php],以創建嚴格的弱命令函子,或者你需要的lambda。

例如,在上一個答案的示例Person_Comparator中,您只需填寫嚮導窗體中的三個字段,如this picture所示。

欲瞭解更多詳細信息,您可以參考here還有:

最好的問候, 吉姆Xochellis

相關問題