C++ 为什么我们仍然需要定义自己的函数比较器

C++ 为什么我们仍然需要定义自己的函数比较器,c++,stl,C++,Stl,在一些stdlibrarytemplate的参数中,需要定义自己的函数比较器less(a,b),more(a,b)然后std::some_template,但为什么?比较器的目的是允许对已排序的stl容器中的对象进行排序。如果默认的比较器不适合容器将容纳的对象类型,则只需要提供自己的比较器 例如,如果要创建以下结构的std::集,则需要编写自己的比较器 struct Person { std::string first_name, last_name, phone_number; }

在一些
std
library
template
的参数中,需要定义自己的函数比较器
less(a,b)
more(a,b)
然后
std::some_template
,但为什么?

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

例如,如果要创建以下结构的std::集,则需要编写自己的比较器

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;
    }
};
struct Person\u比较器
{
布尔运算符()(const Person&a、const Person&b)const{
返回a.last\u name
比较器的用途是允许对已排序stl容器中的对象进行排序。如果默认的比较器不适合容器将容纳的对象类型,则只需要提供自己的比较器

例如,如果要创建以下结构的std::集,则需要编写自己的比较器

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;
    }
};
struct Person\u比较器
{
布尔运算符()(const Person&a、const Person&b)const{
返回a.last\u name
另一个例子让我们用一些不同的标准建立一个集合

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

另一个例子让我们用一些不同的标准建立一个集合

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

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

例如,在前面答案的
Person\u Comparator
示例中,您只需要在向导表单中填写三个字段,如图所示

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

致以最良好的祝愿,
Jim Xochellis

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

例如,在前面答案的
Person\u Comparator
示例中,您只需要在向导表单中填写三个字段,如图所示

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

致以最良好的祝愿,
Jim Xochellis

大多数都有自己的默认比较器。这都是程序员的责任intention@H2CO3我不知道该怎么称呼这个词这就是为什么我叫它stl,sorry@mr5你是说“模板”吗?它允许对用户定义的类型进行用户定义的比较。@0x499602D2但我看不出其中的意义,嗯,它几乎只有less()或more()或equal()?大多数都有默认的比较器。这都是程序员的责任intention@H2CO3我不知道该怎么称呼这个词这就是为什么我叫它stl,sorry@mr5你是说“模板”吗?它允许对用户定义的类型进行用户定义的比较。@0x499602D2但我看不出其中的意义,嗯,它几乎是less()或more()或equal()?