关于std :: sort的比较函数对象

时间:2014-11-16 07:06:53

标签: c++

在以下两个例子中: 例1:

struct less_than_key
{
    inline bool operator() (const MyStruct& struct1, const MyStruct& struct2)
    {
        return (struct1.key < struct2.key);
    }
};

std::vector < MyStruct > vec;

vec.push_back(MyStruct(4, "test"));
vec.push_back(MyStruct(3, "a"));

std::sort(vec.begin(), vec.end(), less_than_key());  //LINE1

示例2:

std::array<int, 10> s = {5, 7, 4, 2, 8, 6, 1, 9, 0, 3}; 
struct {
    bool operator()(int a, int b)
    {   
        return a < b;
    }   
} customLess;
std::sort(s.begin(), s.end(), customLess);        //LINE2

为什么LINE1的比较功能对象有&#34;()&#34;,即less_than_key()? LINE2的比较功能对象没有&#34;()&#34;,即customLess?

3 个答案:

答案 0 :(得分:2)

第1行有括号,因为它创建了less_than_key类的实例并将其作为参数传递(即它创建了一个值)。

第2行没有括号,因为它已经是所提供的匿名结构的一个实例(即它已经是一个值)。

std::sort期望比较器对象的一个​​实例能够工作,这就是为什么你有时可以在适当的位置构造它们或者提供一个已经构造的实例。

答案 1 :(得分:1)

在示例1中,您声明了一个名为less_than_key的结构,但您没有此结构的任何实例,您只有一个声明。在LINE 1中,您调用struct的构造函数并创建std :: sort函数使用的对象的实例。

在示例2中,它是不同的。你也声明了一个结构,这次没有名字(匿名),但区别在于你正在创建一个实例&#34; customLess&#34;这种类型(隐式调用构造函数)。因此,由于您已经创建了实例,因此您无需在std :: sort函数中创建它。

查看结构声明的不同之处:

1.- struct less_than_key {...};

2.- struct [some_name_if_wanted] {...} customLess ;

答案 2 :(得分:0)

std::sort需要比较函数 object 。在第一个示例中,您正在构建一个对象。在第二个示例中,您已经有一个。最简单的例子是查看透明的比较器,即std::less<>(),这是一个类模板。