C ++中自定义对象和运算符重载的比较

时间:2011-02-15 10:24:12

标签: c++

阅读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);
    }
};

4 个答案:

答案 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参数)。