0

在某些stdtemplate的参数中,需要定义他/她自己的函数比较器less(a, b)more(a, b)但是std::some_template<T, *, myComparator()>为什么呢?

4

3 回答 3

5

比较器的目的是允许对已排序的 stl 容器中的对象进行排序。如果默认比较器不适用于容器将容纳的对象类型,您只需要提供自己的比较器。

例如,如果您要制作以下 std::set struct,那么您需要编写自己的比较器。

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

默认比较器知道如何比较数字和字符串,但不知道如何比较 Person 对象。这就是编写自定义比较器以按姓氏对 Person 对象进行排序的方式。

struct Person_Comparator
{
    bool operator()(const Person &a, const Person &b) const {
        return a.last_name < b.last_name;
    }
};
于 2013-07-27T14:29:20.260 回答
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);
        }
};
于 2013-07-27T15:16:30.223 回答
0

我们仍然偶尔需要在泛型编程中定义自己的函数比较器,但我们并不总是需要自己编写 :) 你可以使用这个在线向导 [http://www.xochellis.org/genericdataordering/wizard.php ] 来创建您需要的严格弱排序函子或 lambda。

例如,在Person_Comparator上一个答案的示例中,您只需要在向导表单中填写三个字段,如图所示

有关更多详细信息,您也可以参考这里

最好的问候,吉姆 Xochellis

于 2013-07-28T18:21:36.037 回答