阅读this有关如何在C ++中比较自定义对象的问题。 我不明白这里使用的运算符重载。什么是运营商在这里超负荷?是吗 ()?重载有什么用?
struct MyStruct
{
int key;
std::string stringValue;
MyStruct(int k, const std::string& s) : key(k), stringValue(s) {}
};
struct less_than_key
{
inline bool operator() (const MyStruct& struct1, const MyStruct& struct2)
{
return (struct1.key < struct2.key);
}
};
答案 0 :(得分:3)
重点是使用less_than_key
对象作为函数:
less_than_key f;
bool result = f(key1, key2);
可以像函数一样调用的对象(包括花园多样性函数)有时被称为仿函数(警告:这不是数学中仿函数的含义),或函数对象,或者有时 functoids 。
许多标准库算法和容器都希望这些函数对象作为参数。例如,可以使用二进制函数对象(与您向我们展示的对象一样)自定义std::map
,以了解它应如何对键进行排序。
请参阅this beginners' book list并阅读有关标准算法和容器的信息,以了解可以使用这些野兽的位置。
函数对象和迭代器是C ++标准库的核心,你应该真正了解它们以充分利用C ++。
答案 1 :(得分:1)
operator()是一个函数调用操作符,最常见的用途是允许您在一个对象上使用普通函数调用语法,该对象可以被认为是以“类似函数”的方式运行。
在此示例中,您可以调用STL排序使用的less_than_key()。
答案 2 :(得分:1)
这称为仿函数。这在C ++ apis中使用很多。其中一些api采用了一个执行对象特定操作的仿函数。
Example pseudo code:
- Sorting a list of MyStruct objects.
sort api in algorithm.
std::list<MyStruct> mystructlist;
// populate mystructlist
sort(mystructlist.begin(), mystructlist.end(), less_than_key);
答案 3 :(得分:0)
它通常被称为“仿函数”运算符,它很有用,因为它模仿了对常规函数的调用语法。
具有此类重载运算符的对象通常与stl
算法一起使用,例如std::find_if()
或在您的情况下std::sort()
。
以下是一些示例:
std::vector<MyStruct> myvector;
less_than_key comparator;
std::sort(myvector.begin(), myvector.end(), comparator);
或者:
MyStruct a, b;
less_than_key comparator;
if (comparator(a, b))
// Do something
else
// Do something else.
正如您所看到的,调用operator()
实例的less_than_key
方法和使用相同原型调用函数之间没有语法差异(好吧,忽略隐藏的this
参数)。