为什么这个程序重载()运算符?

Sea*_*ock 4 c++ stl set

目前我正在学习标准模板库(STL).

在这个程序中,我将一些长值存储在Associative Container中,然后根据单位的位置对它们进行排序(根据单位的数量).

代码:

#include <iostream>
#include <set>
#include <functional>

using namespace std;

class UnitLess
{
public:
    bool operator()(long first, long second)
    {
        long fu = first % 10;
        long su = second % 10;

        return fu < su;
    }
};

typedef set<long, UnitLess> Ctnr;

int main(void)
{
    Ctnr store;

    store.insert(3124);
    store.insert(5236);
    store.insert(2347);
    store.insert(6415);
    store.insert(4548);
    store.insert(6415);

    for(Ctnr::iterator i = store.begin(); i != store.end(); ++i)
    {
        cout << *i << endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

但我不明白为什么我们的教授有重载()操作符?

谢谢.

Bjö*_*lex 7

UnitLess是一个二元谓词,需要在STL中具有两个参数可调用.

通过在UnitLess该类型的实例中重载函数调用操作符可以像使用两个longs并返回a 的函数一样使用bool.

UnitLess f;
f(5, 10);
Run Code Online (Sandbox Code Playgroud)

相当于

bool f(long first, long second)
{
    long fu = first % 10;
    long su = second % 10;

    return fu < su;
}
f(5, 10);
Run Code Online (Sandbox Code Playgroud)


Mac*_*cke 7

该类的目的是实现一个以给定方式对集合中的元素进行排序的函数.这被称为谓词.

它被实现为一个仿函数,即允许函数操作符在一个对象上使用(这就是std :: set在引擎盖下做的事情).这样做是STL和类似代码调用自定义对象的常用方法.(函数指针比函数对象(aka functor)更受限制

所以它的使用方式如下:

Unitless functor;

functor(123, 124); // returns true or false
Run Code Online (Sandbox Code Playgroud)

std :: set是一个已排序的二叉树,因此它会在每个插入上多次调用Unitless的()-operator来确定每个long值的位置.

尝试编译并在其中放置一些printf/std :: cout,看看会发生什么.

另外,请注意这样的回调(即当您看不到对代码的调用时)在学习曲线的开头是可怕且令人困惑的.

  • 然后你习惯了它并且全部使用它们,因为它们很整洁.
  • 然后你的代码再次变得可怕和混乱,你就像瘟疫一样避开它们.
  • 然后你成为一个管道磁带程序员,只在适当的地方使用它们,但从未在其他地方使用它们.

;)