关于 std::sort 的比较函数对象
About the comparison function object of std::sort
在以下两个示例中:示例 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 中的比较函数对象有"()",即 less_than_key()? LINE2 处的比较函数对象没有 "()",即 customLess?
第
1 行有括号,因为它正在创建less_than_key
类的实例并将其作为参数传递(即它正在生成值)。
第 2 行没有括号,因为它已经是提供的匿名结构的实例(即它已经是一个值)。
std::sort
期望比较器对象的实例能够工作,这就是为什么您有时可以就地构造它们或提供已构造的对象。
在示例 1 中,您声明了一个名为 less_than_key 的结构,但您没有此结构的任何实例,您只有一个声明。在第 1 行中,您正在调用结构的构造函数并创建要由 std::sort 函数使用的对象的实例。
在示例 2 中,情况有所不同。您还声明了一个结构,这次没有名称(匿名),但不同之处在于您正在创建这种类型的"customLess"实例(隐式调用构造函数)。因此,由于您已经创建了实例,因此无需在 std::sort 函数中创建它。
看看结构声明的差异:
1.- 结构less_than_key { ... };
2.- 结构 [some_name_if_wanted] { ... } 自定义无;
std::sort
需要一个比较函数对象。在第一个示例中,您正在构造一个对象。在第二个示例中,您已经有一个。最简单的例子是查看透明比较器,即std::less<>()
,这是一个类模板。
相关文章:
- 如何使用单独文件中的派生类访问友元函数对象
- 当使用透明的std函数对象时,我们还需要写空的尖括号吗
- 有没有办法将重载的类函数绑定到函数对象?
- 将指针传递到成员的指针,从模板参数包到函数对象
- 如何在类模板的成员函数中正确调用函数对象?正在生成 Visual Studio 编译器错误 C2440
- 隐式转换为比较函数对象(函子)用于 std::sort 而不是 std::map?
- C++使用函数对象的线程,如何调用多个析构函数而不是构造函数?
- 如何通过接口将函子分配给函数对象
- 对std::函数对象的调用不匹配,该对象是指向成员函数的指针
- 指向std::invoke中成员函数对象的指针
- 如何成功地将函数对象(或lambda)传递给trackbar回调的第二个参数(void*)
- "std::function"的简单版本:函数对象的生存期?
- C++ 将函数对象作为左值和/或右值传递
- SFINAE 用于具有默认参数的函数对象
- 构造函数对象赋值是否泄漏内存
- 如何发送通过绑定到函数/方法创建的函数对象?
- std::for_each 与函数对象
- 将函数对象传递给 std::function
- 访问执行策略for_each函数对象中的迭代器
- 通过C++函数对象类访问参数